Git的常用命令,大白话解释,让你快速上手

Git


2017/3/4  更新fetch、pull、rebase相关的命令,长期不定时更新必要的git命令。


准备工作:

根据自己的情况,下载安装Git(我这里是windows 10)。Git的使用可以通过命令行或者图形界面使用,这里推荐命令行并且只讨论通过命令行的方式使用。

安装好后,在文件系统的任意位置(比如桌面)右击鼠标,你会看到有个Git Bash Here,这个就是我们要的。

Git Bash

找到你需要使用git的项目文件夹,然后在该文件夹下右击鼠标,打开git bash(或者先打开git bash然后切换到目标文件夹),接着就可以开始使用git了:

注:按照日常使用git的顺序来罗列

git init —— 将当前所在的文件夹变成git仓库,也就是初始化一个git仓库。


add和commit


git add filename.txt —— 修改文件后,请求将filename.txt放入git暂存区,这条语句可以多次实施

git add ./ —— 请求将当前目录所有更改的文件放入git暂存区,这条语句可以多次实施。

git commit -m "add file success" —— 提交修改请求,将暂存区内容提交到版本库,更新版本库最新版本(不管之前add了几次,全部一次提交),-m后面是本次提交的文字说明


查看、撤销和回退


git status —— 查看仓库当前状态,查看有没有add和commit等信息

git log—— 查看最近几个commit的详细历史记录,会得到每一个commit的类似如下的信息:

commit a9ca35f38c7bbd0e91af5e05dc7a88bc5f76a00d

Author: DongHui

Date:  Sun Nov 20 18:14:17 2016 +0800

first

第二行的一串数字字母是commit id,最后的first是该commit的说明

git log --pretty=oneline —— 查看所有commit的简易历史记录。顾名思义,只用一行显示每个commit信息

git show 1234567 —— 查看commit id 为1234567...的详细信息

git diff —— 查看当前工作区(也就是你最新的修改了但还没有add的项目文件)和暂存区的不同。

git diff filename.txt —— 和git diff一样,不过是查看具体文件。

git diff HEAD —— 查看当前工作区,和git版本库里最新版本的不同

git diff HEAD -- filename.txt —— 和git diff HEAD一样,不过是查看具体文件

git checkout -- filename.txt —— 撤销filename.txt当前工作区的修改,不管现在工作区暂存区版本库是什么状态,这条语句的本质是:暂存区内容覆盖工作区内容。如果之前并没有任何add操作,那么执行这条语句后,filename.txt的工作区、暂存区和版本库应该是一致的。

git checkout ./ —— 撤销当前工作区全部文件的修改。本质同上。

git diff --cached或者git diff --staged —— 查看当前暂存区和git版本库里最新版本的不同

git reset HEAD -- filename.txt —— 撤销暂存区的修改,这条语句的本质是:版本库最新版本覆盖暂存区,工作区不受影响

git reset HEAD 或者 git reset —— 撤销暂存区的修改。本质同上。

git reset --hard HEAD^ —— 回退到上一个版本,其中HEAD表示当前版本,HEAD^表示上一个版本

git reset --hard HEAD^^ —— 回退到上上个版本

git reset --hard HEAD~100 —— 回退到往上100个版本

git reset --hard 1234567 —— 转到commit id为1234567......的那个版本,commit id很长且唯一,只要写出前几位(7位足够了)git会自动识别是哪一个commit,使用这条命令不仅可以回退到某个历史版本,也可以定位到比较新的版本。

但是怎么查看commit id呢?

git reflog —— 列出所有命令记录

git rm filename.txt —— 从版本库中删除filename.txt


关于远程库的命令


以github为例,新建好github仓库(配置过程不赘述)

git remote add origin git@github.com:DongHui44/myfirstrepository.git —— 使用SSH的方式关联远程库(配置SSH方法另行查询)其中DongHui44是我的github账号,myfirstrepository是我的远程仓库。

git remote add origin https://github.com/DongHui44/myfirstrepository.git —— 使用https的方式关联远程库

推荐SSH的方式关联,关联后,远程仓库的默认名称为origin,想改也可以改。

git push -u origin master —— 第一次推送master分支的所有内容

git push origin master —— 推送到远程仓库的master的分支,在这之前要先commit。这里的master也可以是其他分支

git clone git@github.com:DongHui44/myfirstrepository.git —— 在合适的地方将远程的仓库克隆到本地,在此之前,同样要配置SSH。在克隆的时候,git自动把远程库的master分支和本地的master分支对应起来,远程库的默认名称为origin

git remote —— 查看远程仓库的信息

git remote -v —— 查看远程仓库的详细信息

git push --set-upstream origin newFunction —— 远程库没有本地的分支的话,第一次push要使用这条语句,那么远程库也会创建一个名为newFunction的分支仓库与之对应,同时上传本地内容

git fetch origin —— 获取远程库的所有分支最新版本到本地

git fetch origin remoteBranch —— 获取远程库分支remoteBranch最新版本到本地,这个时候本地代码未受到影响,可以将两者进行对比等操作

git pull origin remoteBranch —— 相当于git fetch origin remoteBranch和git merge origin/remoteBranch两步操作


创建、切换、合并分支


git checkout -b newFunction —— 创建分支newFunction并切换到newFunction

上面一句相当于以下两句命令:

git branch newFunction —— 创建分支newFunction

git checkout newFunction —— 切换到newFunction

git branch —— 查看所有分支,其中当前所在分支的前面会标注星号*

git checkout master —— 在newFunction下修改文件A并add、commit后,切换到master分支

git merge newFuction —— 把newFunction的修改合并到master中,不推荐使用这条语句,因为有时候merge会处于Fast forward模式,这种模式下,合并分支后,newFunction分支相关信息会被删除。建议合并时采用下面的语句,禁用Fast forward模式

git merge --no-ff -m "merge info" newFunction —— 合并newFunction的修改到master中,合并后newFunction依然存在,需要删除时手动删除即可。

注意:如果newFunction和master各自修改了同样的地方,产生了冲突,那么git merge会失败,git会给出提示,将冲突的地方修改好即可再次merge


接下来讲rebase,rebase和merge很类似,都是合并分支,但是一般情况下不建议用rebase,为什么呢?下面会讲

git rebase newFunction —— 合并newFunction到master

下面看看rebase和merge的区别,它们的过程如下图所示

说明1:master是主分支,branch是另一个分支,master0,master1,branch0这些都是commit记录

说明2:merge采用git merge --no-ff -m "merge info" branch name这条语句,所以会有master4

我们假设merge和rebase的过程一帆风顺,当要把branch合并到master时,merge是形成一个新的提交master4,而branch中的commit也会按照时间先后插入到master的commit记录。而rebase的情况就和上图一样,rebase后master的commit记录一定是这样的:master0->master1->branch0->branch1->branch2->master2->master3,而原来的branch不受影响,是不是突然理解了为什么叫rebase了?

使用rebase表面上看起来和merge是一样的,但实际git在背后的操作完全不一样。merge的commit记录是严格按照时间显示的,分支上commit在通过merge合并到主分支后,其commit记录也按照时间的前后合并到主分支,而rebase不是这样。结论:rebase和merge很像,但是有一个坏处:让你commit记录变得混乱。

注意:如果newFunction和master各自修改了同样的地方,产生了冲突,那么git rebase会失败,先解决冲突,然后执行下面的命令:

git rebase --continue —— 运行这条语句继续rebase,这里要注意,执行这条语句前要先执行git add


git branch -d newFunction —— 删除分支newFunction


stash、tag的使用


git stash —— 将当前未提交(但是还不能提交)的工作现场储藏起来。有的时候要立刻停止当前工作,创建分支,解决问题,合并分支,然后接着原来的工作,这个时候就要用到这条命令。这条语句可以多次使用。

git stash list —— 查看储藏起来的工作现场

git stash apply —— 恢复工作现场,此时,储藏的工作现场并没有删除

git stash drop —— 删除储藏的工作现场

git stash pop —— 恢复工作现场,同时把储藏的工作现场删除

git tag v1.0 —— 在最新commit的基础上,给当前分支打一个标签,可以表示版本号等等,这里的标签是:v1.0

git tag —— 查看所有标签,标签是按字母排列的

git tag v0.1 123456 —— 给commit id是123456开头的commit打标签,标签为:v0.1

git show v1.0 —— 查看标签为v1.0的commit的详细信息

git tag -d v1.0 —— 删除标签v1.0

git push origin v0.1 —— 推送标签v0.1到远程仓库

git push origin --tags ——推送所有标签到远程仓库

git push origin :refs/tags/v0.1 —— 删除远程仓库里的v0.1标签,在这条命令前要确保之前已经在本地删除了v0.1标签


其他常用命令


git config --global color.ui true —— 配置ui的颜色

在实际应用git时,有一些文件不能也没有必要被push到远程仓库,git提供了解决方案。

在git工作区的根目录下新建一个.gitignore文件,在里面配置想要git忽略推到远程仓库的文件类型。(作为安卓开发者,额外提一句:Android Studio好像自动帮我们创建了.gitignore文件,其他软件不清楚)

工作区内容不同,配置也相应不同,具体可参考:https://github.com/github/gitignore该github项目提供了各种工作内容需要配置的忽略文件。

git add -f example.class —— 强制add某个文件,不管这个文件有没有被忽略,这里是example.class。

如果git add失败并被系统提示已经进入忽略名单,那么可以使用以下命令查看忽略详情

git check-ignore -v example.class —— 查看example.class被忽略的详情

回车后,系统会返回信息,例如:

.gitignore:3:*.class    example.class

意思是.gitignore文件的第三行的*.class导致的忽略。

git可以给系统指令改别名

git config --global alias.st status —— 意思是用st代替status,以后每次要查看状态(git status)只需要git st就行了,--global意思是该用户下全局生效。

再举例子:

git config --global alias.co checkout —— 用co代替checkout


注1:git命令繁多,本文没有提到的可以自己查询或者看注2本文所参考的教程,英文好的可以直接去官网看看。

注2:参考资料:廖雪峰的git教程


2017/2/23

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,482评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,377评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,762评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,273评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,289评论 5 373
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,046评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,351评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,988评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,476评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,948评论 2 324
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,064评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,712评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,261评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,264评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,486评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,511评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,802评论 2 345

推荐阅读更多精彩内容