Git 常用命令

1. diff 与 patch

两个文件:source.txt target.txt
hello world
4
1
diff 来比较两个文件的差异:


2、git reset :

重置文件:git reset [-q] [<commit>] -- paths

不影响工作区、暂存区、版本库。
用commit中的文件覆盖相当于将文件从暂存区中拿出来,恢复到没有add

3、 git checkout

  • 切换分支
  • git checkout -- file:用暂存区的文件覆盖工作区文件
  • git checkout commit file: 用commit中的文件覆盖 暂存区和工作区

4、忽略文件

  • .gitignore 对未跟踪的文件有效,
    • 范围:所在目录及子目录起作用。共享式,会随着项目而生效

    如果文件被忽略,可以使用 git add -f file 来添加文件,添加进去的文件将不受 .gitignore 影响

  • .git/info/exclude 项目独享式
  • git config —global core.excludesfile ~/.gitignore: 全局独享式,对所有的git项目都起作用

5、文件归档

  • git archive -o targe.zip HEAD
  • git archive -o partial.tar HEAD src doc
  • git. archive —format=tar —prefix=1.0/ v1.0 | gzip > foo-1.0.tar.gz;

    使用 tag,最后会产生1.0目录,下面是tag v1.0 的所有文件

6、清除未跟踪文件

git clean -n -fd :

  • -n 显示即将删除的文件;
  • 这里的删除指的是 git 不追踪 这些文件,并不删除物理文件。因为有时会产生很多临时文件,随时改动 .gitignore 太麻烦,这时使用git clean -n -fd 可以使得git 不追踪这些没有添加到git 库中的文件。

7、保存恢复工作进度

  • git stash: 默认会重置工作区和暂存区
    • --keep-index:不会重置暂存区
    • "message": 保存进度时留下提醒信息

8、git cherry-pick

3 步走:挑选提交 --- 切换到当前分支 --- 覆盖工作区和暂存区

  • git cherry-pick commit
  • git checkout currentBranch
  • git reset --hard HEAD@{1}

挑选指定提交放入到当前的HEAD;
假设有 A B C D E F 这6个提交记录, 现要挑选 E F 并放到C上,即删除D,如下:

  • git checkout 到指定提交: git checkout D^
  • git cherry-pick E:将提交点 E 放入当前HEAD, HEAD前进一步指向E。
  • git cherry-pick F:将提交点 F 放入当前HEAD, HEAD前进一步指向TagF。
  • git checkout dev; git reset --hard HEAD@{1}: git checkout dev也会产生一个commit,所以应该使用HEAD@{1} 来覆盖当前的版本库。
  • 结束,其中上一步是至关重要的。

C 和 D 的提交说明合并为一个提交说明,这里合并为C的提交说明。
因为只是合并提交说明,所以,
应该将版本库 git reset --softB
工作区和暂存区git checkout D, 然后commit 产生一条新的记录,
并将 E F 放到当前HEAD

  • git checkout D:工作区和暂存区切换到D
  • git reset --soft HEAD^^: 版本库切换到 B
  • git commit -C C:使用 C 的提交说明,进行提交
  • git cherry-pick E, git cherry-pick F:将 E 和 F 重放到当前的HEAD
  • git checkout dev, git reset --hard HEAD@{1}: 覆盖工作区

9、git rebase

git rebase --onto base since_commit till_commit

3 步走:切到新的 HEAD(一个 commit)--- 拣选区间 --- 更新工作区和暂存区

变基操作:git cherry-pick 一个一个挑选,git rebase 挑选 (since_commit, till_commit] 区间段的提交

删除提交D:

  • git checkout D^:
  • git rebase --onto= HEAD E^ dev: 相当于
       git rebase --onto= HEAD E^ F 
       git checkout dev
       git reset --hard HEAD@{1} 
    

合并提交C 和 D

  • git checkout D
  • git reset --soft HEAD^^:版本库回退到BC的前面提交)
  • git commit -C C:使用提交 C 的提交记录作为新的提交记录
  • git rebase --onto=HEAD E^ dev:将 [E, ] 区间的提交放入 HEAD上,并修改工作区和暂存区。

10、git rebase -i commit^

commit 作为HEAD 进行交互式 git rebase,通过编辑 编辑操作文件来完成相应的工作。

11、删除提交历史说明

这里删除的是提交说明,而不是提交!

2 步:构造一个新的根提交 --- 将想要保存的提交历史说明变基到该新的提交
只保留 B 之后的提交说明,如下:

  • 构造一个新的根提交

    • git commit-tree B^{tree} -m commit-log: 得到一个commit-id 0a47615cc90f6a5b82
    • 将 B 的将提交记录中 parent-commit 删除,将剩下的信息作为 commit 对象 写入对象库,构造成为一个根提交。
        # 1. 提交 B 的 log
        git cat-file commit B^0 : 
        
        tree e0e82db036311d293e97d4cab06194fc2f999d14
        parent e5724199303f41c6fbdbaa6e43896c98f041367c
        author jack <yudianer1991@hotmail.com> 1533474089 +0800
        committer jack <yudianer1991@hotmail.com> 1533474089 +0800
        B
      
        # 2. 保存去除 parent 之后的信息, 保存到 tmpfile
        git cat-file commit B^0 | sed -e "/^parent/d" > tmpfile
        
        tmpfile 内容:
        tree e0e82db036311d293e97d4cab06194fc2f999d14
        author jack <yudianer1991@hotmail.com> 1533474089 +0800
        committer jack <yudianer1991@hotmail.com> 1533474089 +0800
        B
      
        # 3. 将 tmpfile 内容写入对象库,形成新的根提交 
        git hash-object -t commit -w tmpfile
          -t: 指定产生的对象的类别
          -w: 指定写入对象库的文件
        
        产生 commit-id:bee2b046d9d36a18d1c3e95077a92014b4b5bf89
      
  • B^ dev 的提交记录变基到新的根提交:
    git rebase --onto=bee2b046d9d36a1 B^ dev

  • 最终提交记录:

    5172477f5b4d4c56828461ded63447fee869b4dd (HEAD -> dev) g
    2113fa495b5c084b286e18ada708826a9e4d3a85 F
    83a66109b5a4922a770a914e608d65d003646749 E
    a2cafa33143a369be71faa02ddb329266541f2fc D
    a68285d9a1832e508429a0b9f39fa638d9dbf667 C
    bee2b046d9d36a18d1c3e95077a92014b4b5bf89 B
    

12、 git revert

git revert commit-id : 撤销 commit-id 对应的提交,但是不会删除commit-id 的提交记录,这是需要手动删除的.

13、 git push

快进式操作:git push 提交的时候,如果当前的commit是远程版本库当前分支现有的基础上,即远程版本库的最新commit是本地当前分支最新提交的祖先提交,那么直接提交。 一般情况下只允许 快进式提交

git push -f: 如果提交不通过 快进式操作 检验,则会出现 非快进式 错误,那么可以使用 git push -f 来强制推送更新远程版本库。

  • git rev-list HEAD --max-count=5 :查看本地 HEAD 上最新的 5 个提交。
  • git ls-remote origin : 查看远程各个分支的的最新 commit-id

通过git rev-list HEAD --max-count=5git ls-remote origin 可以对比是否会产生非快进式操作问题。

14、 git log

  • git log -3 --stat --online: 显示前3个 log 信息,并呈现提交的变更。
    git log -3 --stat --oneline --pretty=full --graph :

* commit e40d1be (HEAD -> dev, origin/dev)
| Author: jack <yudianer1991@hotmail.com>
| Commit: jack <yudianer1991@hotmail.com>
|
|     g
|
|  new.file | 2 ++
|  rebase   | 1 +
|  2 files changed, 3 insertions(+)
|
* commit 61ce462 (tag: F)
| Author: jack <yudianer1991@hotmail.com>
| Commit: jack <yudianer1991@hotmail.com>
|
|     F
|
|  rebase | 1 +
|  1 file changed, 1 insertion(+)
|
* commit cce0039 (tag: E)
| Author: jack <yudianer1991@hotmail.com>
| Commit: jack <yudianer1991@hotmail.com>
|
|     E
|
|  rebase | 1 +
|  1 file changed, 1 insertion(+)

14、 git tag

tag 创建之后默认不会推送到远程版本库,必须显示地 git push origin tagname 提交tagname, 或者 git push origin refs/tags/* 来推送所有的tag。

git pull 时默认会拉取所有的 tag,但是在tag有更新时,不会拉取更新后的tag内容。
git pull refs/tags/mytag:refs/tags/mytag : 将会强制用远程的 mytag 来更新本地的mytag

1、创建 tag

  • git tag tagname [<commit>]
  • git tag -m msg -s tagname [<commit>]
    • -m:添加 tag 说明
    • -s: 添加签名

2、查看 tag

  • git tag -l my*: 列出 能够匹配 my* 的tag

3、删除 tag

  • git tag -d tagname:删除本地的 tagname
  • git push origin :tagname: 删除远程的 tagname

15、分支

1、创建分支

  • git branch <branch-name> <commit-id>:commit-id 出建立分支,默认是从HEAD。
  • git push -u origin <new-branch-name>:将本地<new-branch-name> 分支推向远程,-u 自动跟踪远程的同名分支。
    git branch --set-upstream-to=origin/dev:当前分支自动跟踪远程的dev分支。

2、删除分支

  • git branch [-d|-D] branch-name:删除本地分支
    -d :如果 branch-name 已经合并到其他分支,则删除。
    -D : 直接强制删除。
  • git push origin :branch-name:删除远程 branch-name 分支。
  • git branch [-m|-M] branch-old-name branch-new-name:更换branch名称
    -m : 如果已经存在branch-new-name ,更名失败。
    -M:强制更名。

3、查看分支

  • git branch:查看本地分支。
  • git branch -r | git ls-remote :查看远程分支。

4、跟踪分支

  • git branch -b local-branch origin/branch:基于远程branch 分支创建本地分支,并追踪。
  • git branch --set-upstream-to=origin/dev:追踪origin/dev

16、远程版本库

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

推荐阅读更多精彩内容