蛮荆

Git 边边角角

2019-11-11

命令一览

Git 命令

三棵树

Git 结构

Fast Forward

“快进式合并”(fast-farward merge),会直接将 master 分支指向合并的分支,这种模式下进行分支合并会丢失分支信息,也就不能在分支历史上看出分支信息。

可以在合并时加上 –no-ff 参数来禁用 Fast forward 模式,并且加上 -m 参数让合并时产生一个新的 commit。

$ git merge --no-ff -m "merge with no-ff" dev

Git fast forward

Stashing

在一个分支上操作之后,如果还没有将修改提交到分支上,此时进行切换分支,那么另一个分支上也能看到新的修改。这是因为所有分支都共用一个工作区的缘故。

可以使用 git stash 将当前分支的修改储藏起来,此时当前工作区的所有修改都会被存到栈中,也就是说当前工作区是干净的,没有任何未提交的修改。此时就可以安全的切换到其它分支上了。

$ git stash

Saved working directory and index state \ "WIP on master: 049d078 added the index file"
HEAD is now at 049d078 added the index file (To restore them type "git stash apply")

该功能可以用于 bug 分支的实现。如果当前正在 dev 分支上进行开发,但是此时 master 上有个 bug 需要修复,但是 dev 分支上的开发还未完成,不想立即提交。在新建 bug 分支并切换到 bug 分支之前就需要使用 git stash 将 dev 分支的未提交修改储藏起来。

Git 钩子列表

  • applypatch-msg
  • post-merge
  • pre-auto-gc
  • prepare-commit-msgcommit-msg
  • post-receive
  • pre-commit
  • push-to-checkoutpost-applypatch
  • post-rewrite
  • pre-push
  • updatepost-checkout
  • post-update
  • pre-rebasepost-commit
  • pre-applypatch
  • pre-receive

Git Hook

git merge & git rebase

Git merge with rebase

git merge master git rebase master
合并 master 的记录到分支,合并之后的所有 commit 会按提交时间从新到旧排列 当前分支的 HEAD 会移动到 master 的结尾,但会变成一个新的 commit
用 git log –graph 查看的话,会看到交叉线 git log –graph 是一条漂亮的直线
保持了所有 commit 的连贯性 commit 历史被修改了,3b36f32 被修改成了 a018520

什么时候用 rebase,什么时候用 merge?

  • merge 来把分支合并到主干
  • 如果你的分支要跟别人共享,不建议rebase,因为 rebase 会创建不一致的提交历史
  • 如果只有你个人开发推荐使用 rebase
  • 如果想保留完整的提交历史,推荐使用 mergemerge 保留历史 而 rebase 重写历史
  • rebase 还可以压缩、简化历史,通过 git rebase -i 可以在分支合并到主干前,整理自己分支的提交历史,把很多细碎的 commit 整理成一条详细的 commit
  • rebase 一次只处理一个冲突,merge 则一次处理全部冲突。处理冲突 rebase 更方便,但如果有很多冲突的话,撤销一个 rebase 会比 merge 更复杂,merge 只需要撤销一次

转载申请

本作品采用 知识共享署名 4.0 国际许可协议 进行许可,转载时请注明原文链接,图片在使用时请保留全部内容,商业转载请联系作者获得授权。