git cherry-pick 与git show + git apply 与git merge
IPFS
如果是有部分的更改或新增功能,用git merge 有时候不见得是好主意
git merge的好处是可以直接把某branch commit 直接整合入另一branch,但如果conflict 超多,有时候反而resolve conflict 会搞到疯掉,特别是两个branch 已经分道扬镳很久。
另一个情况是,某个commit 的”一部分”修改,要套用在现在的branch 上,那merge 也是不太适用。这时候git cherry-pick 就很适合,特别是加上-n (ie –no-commit) 这个指令会把另个commit 的修改全部apply 过来,例如;
$ git cherry-pick 951c5c77 -n $ git status On branch A Your branch is up to date with 'origin/A'. Changes to be committed: (use "git reset HEAD <file>..." to unstage) modified: js/main.js modified: main.html
cherry-pick不需要的部分可以用git rest 配合git add来完成。
另一种方式是用git show 配合git apply,前者可以显示某个commit 做的变更,如果加上档案名称,就只列出该档案的变更。例如:
$ git show 951c5c77 main.html commit 951c5c77be28f0a8c3f21f406895aab187003473 (origin/A, A) Author: P <p@test.com> Date: Thu Mar 28 14:58:43 2019 +0800 some commit message diff --git a/main.html b/main.html index 8f5c4ac..c4f97f3 100644 --- a/main.html +++ b/main.html @@ -84,11 +84,11 @@ <div class="carousel-inner" role="listbox"> </div> - <a class="left carousel-control" href="#glasses-selection" role="button" data-slide="prev"> + <a class="left carousel-control" href="#glasses-selection" role="button" data-slide="prev" id="preitems"> <span class="glyphicon glyphicon-chevron-left" aria-hidden="true"></span> <span class="sr-only">Previous</span> </a> - <a class="right carousel-control" href="#glasses-selection" role="button" data-slide="next"> + <a class="right carousel-control" href="#glasses-selection" role="button" data-slide="next" id="nextitems"> <span class="glyphicon glyphicon-chevron-right" aria-hidden="true"></span> <span class="sr-only">Next</span> </a>
列出不一样的部分,然后再git apply 就可以更新过去了。
$ git show 951c5c77 main.html | git apply
不过用cherry-pick 或git show + git apply 都不会有类似git merge 的那种commit relation 被建立就是,可能得靠commit message 才能知道关联性。
Original link: Phanix's Blog
喜欢我的作品吗?别忘了给予支持与赞赏,让我知道在创作的路上有你陪伴,一起延续这份热忱!