git 常用命令

Git常用命令总结


1.初始化本地仓库

1

gitinit

2.添加文件到本地仓库暂存区

1

gitadda.txt

3.添加文件到本地仓库

1

gitcommit-m'v1'

此命令代表确认提交到本地仓库。-m ‘v1’代表为此添加一个版本标记v1

4.查看当前git的状态

1

gitstatus

结果A:

1

2

3

4

5

6

7

8Onbranchmaster

Changesnotstagedforcommit:

(use"git add ..."toupdatewhatwillbecommitted)

(use"git checkout -- ..."todiscardchangesinworkingdirectory)

modified:readme.txt

nochangesaddedtocommit(use"git add"and/or"git commit -a")

证明当前有文件已经修改,但是没有准备提交的修改,没有add和commit

结果B:

1

2

3

4

5Onbranchmaster

Changestobecommitted:

(use"git reset HEAD ..."tounstage)

modified:readme.txt

证明当前已经有文件提交了,但是还没有commit

结果C:

1

2Onbranchmaster

nothingtocommit,workingdirectoryclean

证明当前所有文件已经提交到本地仓库,工作目录是干净的

5.查看git日志

1

gitlog

结果:

1

2

3

4

5

6

7

8

9

10

11commitaca3fe6cc3f49ded922d05e4774561f33697f710

Author:QingcaiCui<1016903103@qq.com>

Date:SunNov212:16:252014+0800

v2

commit90eea044b6da3818770ec482df98bb05ab569472

Author:QingcaiCui<1016903103@qq.com>

Date:SunNov212:07:462014+0800

v1

证明当前我们已经commit了两次,上面的为最近提交的。

如果嫌输出太多可以尝试下面的命令,一行显示

1

gitlog--pretty=oneline

结果如下:

1

2aca3fe6cc3f49ded922d05e4774561f33697f710v2

90eea044b6da3818770ec482df98bb05ab569472v1

一大串类似的

1

aca3fe6cc3f49ded922d05e4774561f33697f710

是commit id(版本号),和SVN不一样,Git的 commit id 不是1,2,3……递增的数字,而是一个SHA1计算出来的一个非常大的数字,用十六进制表示,而且你看到的commit id和我的肯定不一样,以你自己的为准。为什么commit id需要用这么一大串数字表示呢?因为Git是分布式的版本控制系统,后面我们还要研究多人在同一个版本库里工作,如果大家都用1,2,3……作为版本号,那肯定就冲突了。

6.版本回退

回退到上一版本:

1

gitreset--hardHEAD^

回退到上上个版本:

1

gitreset--hardHEAD^^

如果回退的版本过多则不用加那么多的^号

比如回退到上10版本,则可以用下面的命令

1

gitreset--hardHEAD~10

回退1个版本相当于

1

gitreset--hardHEAD~1

不过现在利用git status来查看已经看不到刚才那个版本了,想要返回的话怎么办

可以仍然用上面的方法

1

gitreset--hardaca3f

只要写前几位就好了,git会自动去匹配的。当然前提是你的命令行窗口没有关闭还能找到之前的commit id。

不过万一你的命令行关闭了也没关系,git提供了一个方法来记录你的每一次命令。

1

gitreflog

结果:

1

2

3

4aca3fe6HEAD@{0}:reset:movingtoaca3f

90eea04HEAD@{1}:reset:movingtoHEAD^

aca3fe6HEAD@{2}:commit:jj

90eea04HEAD@{3}:commit(initial):aa

在前方仍然显示了版本号,你仍然可以找到。仍然可以利用的reset命令来还原。

注意:

A 工作区和暂存区的名词区别

工作区:就是你在电脑里能看到的目录

暂存区:在.git文件夹下存在一个暂存区stage和好多个分支比如master

当执行git add命令时,工作区的内容便会到stage暂存区中,当执行git commit命令时暂存区的内容便会提交到分支里面。

B “Git管理的是修改”的意思

比如第一次修改readme.txt,然后执行git add到暂存区,然后再修改readme.txt,然后执行git commit 到分支。

结果调用 git status 时发现现在仍然有一个modified文件,这是因为我们没有把新修改的文件提交到暂存区,所以导致分支中的文件和在工作区的原文不匹配。所以我们需要重新add和commit。这说明git管理的是”修改”,而不是”文件”本身。

7.撤销修改

1

gitcheckout--filename

比如 git checkout — readme.txt 它的作用如下:

把 readme.txt 文件在工作区的修改全部撤销,这里有两种情况:

一种是 readme.txt 自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;

一种是 readme.txt 已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。

总之,就是让这个文件回到最近一次 git commit 或 git add 时的状态。

那么上面的这个情况是我们提交或者没提交到暂存区之后又对源文件做的修改。

还有另一种情况,我们提交之后放到了暂存区,我们想把暂存区里面的文件撤销回来。

就用以下命令:

1

gitresetHEADreadme.txt

就是将刚才的git add命令撤销,把暂存区中的内容撤销回到工作区。

当然,如果你不但add了,并且又commit了,那就只能进行版本回退了。在上面已经说过了。

总结:

场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout — file。

场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD file,就回到了场景1,第二步按场景1操作。

场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交,进行版本回退,不过前提是没有推送到远程库。

8.删除文件

假如现在你新建了一个 hello.txt 文件,你已经add并commit到了本地分支之中。

现在你想删除,如果直接执行

1

rmhello.txt

则是只把工作区中的文件删除了,本地分支中没有删除,现在你执行git status 则会提示当前工作区已删除了一个文件,本地分支仍然存在,就存在了工作区和本地分支不同步的问题,现在我们如果想恢复一下,就利用下面的命令

1

gitcheckout--hello.txt

将本地的文件一键还原。

假如我们真的是想将本地分支中的一个文件删除,那么我们就执行下面的方法。

1

gitrmhello.txt

执行了这个命令之后,我们执行 git status 之后就会提示 你现在需要commit一下确认删除。

并且执行完这个命令之后,我们执行 ls 命令之后发现本地的文件也已经不存在了。

如果有很多个文件在本地被删除掉了,暂存区和工作区的文件完全不一样了,工作区删除掉了很多个文件,就会出现

1

2

3Changesnotstagedforcommit:

deleted:a.txt

deleted:b.txt

如果一个个地删除文件肯定特别麻烦,所以我们可以用下面的命令来

1

gitadd-A

它等同于

git add . 和 git add -u

1

gitadd.保存所有新文件和改动的文件,不包括删除的文件

1

gitadd-u保存所有改动的文件和删除的文件,不包括新的文件

git add -A 和 git add -u 会把我们未通过 git rm 删除的文件全部stage 使用过以后运行 git status 便会出现 changes to be committed … 说明已经都经过git rm 删除了. 综上,我们想删除分支中的文件时就需要两条命令合起来使用

1

2gitrmhello.txt

gitcommit-m'rm hello.txt'

要小心的是,执行 git rm 方法之后工作区和本地分支中的文件已经都不存在了。所以如果你已经在远程仓库存在备份的话,你就不用担心误删了。否则你就要小心了,会丢失这个文件的。 对比修改的文件

1

gitdiff

结果:

1

2

3

4

5

6

7diff--gita/readme.txtb/readme.txt

index9c58532..8ce5f7e100644

---a/readme.txt

+++b/readme.txt

@@-1+1@@

-gitisgrea

+helloisgrea

-号开头的语句代表这句话删除掉了 +号开头的语句代表这句话为新增语句 9.分支 新建本地分支

1

gitbranchdev

切换到dev分支

1

gitcheckoutdev

创建并切换到该分支

1

gitcheckout-bdev

查看本地分支

1

gitbranch

比如此命令会输出 * master hello 代表当前已经选中了master分支,存在本地两个分支master和hello 合并分支

1

2gitbranchmaster

gitmergehello

这样我们就把 master 分支合并到了hello分支了。 接下来我们就可以删除本地分支了。 既然分支合并这么简单,它可不可能出现什么问题呢?当然有,当然会出现分支合并冲突的问题。 比如我切换到了hello分支并修改了一个文件 add并且commit,然后我切换回了master分支 同样修改了这个文件,add并且commit。现在我们如果执行git merge hello 则会报一个提示说 分支合并冲突。 我们查看刚才修改的文件发现已经发生了变化,我们需要手动修改完了之后,然后继续add和commit才可以。如果没有add和commit,那么我们无法切换回原来的分支的。 add和commit之后,原来的hello分支仍然保持了原来不变,只不过是我们的master分支改变了。下面示意图则清楚地表示出了如下关系,图中的feature1相当于hello分支。 合并之后,我们就可以进行删除分支了,可以删除掉hello分支。其实上面的一系列操作 从merge到修改 然后add 然后commit 其实可以利用一条命令来修改,这个方法叫禁用Fast Forward模式 刚才的一系列命令如下

1

2

3

4

5gitcheckoutmaster

gitmergehello

vifile.txt

gitaddfile.txt

gitcommit-m'merge master'

那么利用下面的语句同样可以达成同样的效果

1

2gitcheckoutmaster

gitmerge--no-ff-m'merge master'hello

因为本次合并要创建一个新的commit,所以加上 -m 参数,把commit描述写进去。 Git就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息。 结束之后我们照样可以删除hello分支。 删除本地分支

1

gitbranch-dhello

查看远程分支

1

gitbranch-r

查看本地和远程分支

1

gitbranch-a

现在遇到一个问题,我们正在工作的一个分支还没有做完,不能add或者commit,但是现在有一个bug需要在另一个分支上去修复,那么我们就需要暂时存储当前的分支。所以就要用到下面的命令

1

gitstash

当我们处理完其他的事情之后,再切换回来此分支。 先使用

1

gitstashlist

再取出stash列表中的内容

1

gitstashpop

上面的方法既取出了list内容,并且把list中的元素删除掉。 强行删除分支

1

gitbranch-Dnew-branch

10.多人协作 多人协作的工作模式通常是这样: 首先,可以试图用

1

gitpushoriginbranch-name

推送自己的修改; 如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并; 如果合并有冲突,则解决冲突,并在本地提交; 没有冲突或者解决掉冲突后,再用

1

gitpushoriginbranch-name

推送就能成功! 如果git pull提示“no tracking information”,则说明本地分支和远程分支的链接关系没有创建,用命令

1

gitbranch--set-upstreambranch-nameorigin/branch-name

这就是多人协作的工作模式,一旦熟悉了,就非常简单。 11.添加远程地址别名

1

gitremoteaddorigingit@github.com

删除远程地址别名

1

gitremotermorigin

此方法删除掉origin这个地址别名

查看远程地址别名

1

gitremote-v

推送到远程分支

我们在github上新建一个项目

添加远程仓库

1

gitremoteaddorigingit@github.com:cqcre/gittest.git

推送上去

1

gitpush-uoriginmaster

加上了 -u 参数,Git不但会把本地的 master 分支内容推送的远程新的 master 分支,还会把本地的 master 分支和远程的 master 分支关联起来,即相当于推送到了一个默认的分支,在以后的推送或者拉取时就可以简化命令。

那么以后我们就不需要关联了,以后推送的话我们只需要输入

1

gitpushoriginmaster

克隆远程仓库

假设现在已经存在了一个远程仓库,我们需要把这个仓库克隆到本地,我们需要使用下面的方法

1

gitclonegit@github.com:cqcre/test.git

这样我们就把远程的一个仓库取到了本地了。

12.强制操作

强制覆盖本地分支内容

1

2gitfetch--all

gitreset--hardorigin/master

强制覆盖远程内容

1

gitpushoriginmaster--force

13.修改commit的备注

有时候我们commit的备注写错了,需要重新修改,可以利用如下命令

1

gitcommit--amend

.gitignore的使用

在git中如果想忽略掉某个文件,不让这个文件提交到版本库中,可以使用修改根目录中 .gitignore 文件的方法(如无,则需自己手工建立此文件)。这个文件每一行保存了一个匹配的规则例如:

1

2

3

4

5*.a# 忽略所有 .a 结尾的文件

!lib.a# 但 lib.a 除外

/TODO# 仅仅忽略项目根目录下的 TODO 文件,不包括 subdir/TODO

build/# 忽略 build/ 目录下的所有文件

doc/*.txt# 会忽略 doc/notes.txt 但不包括 doc/server/arch.txt

规则很简单,不做过多解释,但是有时候在项目开发过程中,突然心血来潮想把某些目录或文件加入忽略规则,按照上述方法定义后发现并未生效,原因是.gitignore只能忽略那些原来没有被track的文件,如果某些文件已经被纳入了版本管理中,则修改.gitignore是无效的。那么解决方法就是先把本地缓存删除(改变成未track状态),然后再提交:

1

2

3gitrm-r--cached.

gitadd.

gitcommit-m'update .gitignore'

打tag

在发布版本的时候,经常会用到打标签的方法。

增加一个标签

1

gittag-a"v1.0.0"-m"Version 1.0.0"

删除一个标签

1

gittag-dv1.0.0

推送所有标签

1

gitpushorigin--tags

删除未监视文件

1

2

3

4

5

6

7

8

9

10

11

12gitclean-f

# 连 untracked 的目录也一起删掉

gitclean-fd

# 连 gitignore 的untrack 文件/目录也一起删掉 (慎用,一般这个是用来删掉编译出来的 .o之类的文件用的)

gitclean-xfd

# 在用上述 git clean 前,墙裂建议加上 -n 参数来先看看会删掉哪些文件,防止重要文件被误删

gitclean-nxfd

gitclean-nf

gitclean-nfd

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

推荐阅读更多精彩内容

  • 我的常用: ===================================** 撤销工作修改:**1、gi...
    ddai_Q阅读 710评论 0 5
  • git config —global user.name “Nshen” //必须git config —glob...
    困卡阅读 361评论 1 9
  • 校区:科学创想机器人和平校区 时间:周二5:00-6:00 学员:喻子宸 任教老师:杨玲 教学目标: 1.知道大海...
    Happy00阅读 176评论 0 0
  • 我知道 我懂的 明明自己很软弱 为什么 为什么 在电话面前没有哭 回望昨天 遥想未来 未来的路在何处 只记得 脸上...
    洪阿柒阅读 208评论 0 0
  • 文/叶丹颖 女儿经过父亲的房间 父亲已经睡了 睡着了的父亲 躺在看不见的漆黑里 女儿轻轻关上门 蹑手蹑脚地离开 父...
    树姑娘阅读 1,837评论 4 3