Git相关commit引用:深入理解“祖先引用”

在Git中,可以使用 SHA、标签、分支和特殊的 HEAD指针引用 commit。有时候这些并不足够,你可能需要引用相对于另一个 commit 的 commit。例如,有时候你需要告诉 git 调用当前 commit 的前一个 commit,或者是前两个 commit。我们可以使用特殊的“祖先引用”字符来告诉 git 这些相对引用。这些字符为:

  • ^ – 表示父 commit
  • ~– 表示第一个父 commit

我们可以通过以下方式引用之前的 commit:

  • 父 commit – 以下内容表示当前 commit 的父 commit
  • HEAD^
  • HEAD~
  • HEAD~1
  • 祖父 commit – 以下内容表示当前 commit 的祖父 commit
  • HEAD^^
  • HEAD~2
  • 曾祖父 commit – 以下内容表示当前 commit 的曾祖父 commit
  • HEAD^^^
  • HEAD~3
    ^~ 的区别主要体现在通过合并而创建的 commit 中。合并 commit 具有两个父级。对于合并commit,^引用用来表示第一个父 commit,而^2表示第二个父 commit。第一个父 commit 是当你运行 git merge 时所处的分支,而第二个父 commit 是被合并的分支。

我们来看一个示例,这样更好理解。这是我的 git log当前的显示结果:

* 9ec05ca (HEAD -> master) Revert "Set page heading to "Quests & Crusades""
* db7e87a Set page heading to "Quests & Crusades"
*   796ddb0 Merge branch 'heading-update'
|\  
| * 4c9749e (heading-update) Set page heading to "Crusade"
* | 0c5975a Set page heading to "Quest"
|/  
*   1a56a81 Merge branch 'sidebar'
|\  
| * f69811c (sidebar) Update sidebar with favorite movie
| * e6c65a6 Add new sidebar content
* | e014d91 (footer) Add links to social media
* | 209752a Improve site heading for SEO
* | 3772ab1 Set background color for page
|/  
* 5bfe5e7 Add starting HTML structure
* 6fa5f34 Add .gitignore file
* a879849 Add header to blog
* 94de470 Initial commit

我们来看看如何引用一些之前的 commit。因为 HEAD 指向 9ec05cacommit:

  • HEAD^db7e87acommit
  • HEAD~1同样是 db7e87a commit
  • HEAD^^796ddb0 commit
  • HEAD~2同样是 796ddb0 commit
  • HEAD^^^0c5975a commit
  • HEAD~3同样是 0c5975a commit
  • HEAD^^^24c9749e commit(这是曾祖父的 (HEAD^^) 第二个父 commit (^2))
    如果你掌握了,不妨回答以下问题:
    HEAD~6引用的是哪一个 commit?
    答案:209752a
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容