[英]git checkout branch — file vs git merge
我擔心git checkout other_branch-文件將覆蓋我當前分支中的文件,並且根本不進行合並。
假設我在一個名為foo的分支上。 我想在foo中合並名為bar.js的文件,並在名為baz的分支上合並相同的文件路徑;
所以git branch -v
看起來像:
* foo adbe2d4 pdev:set
baz ae598f5 [ahead 5] sync-msg
我知道如何執行此操作的方法是:
git checkout baz -- bar.js
我感到困惑的是,這不會覆蓋我的分支上具有相同名稱的文件嗎?
如何從baz合並bar.js,而不是檢出文件並覆蓋foo分支上的工作? 還是我弄錯了,合並確實發生了?
您是正確的,這種結帳形式:
git checkout <tree-ish> -- <path> [ <path> ... ]
只需覆蓋每個路徑的工作樹(和索引!)版本。
通常,您不希望僅合並一個文件,而是希望將其他分支的尖端提交與當前提交合並(如果成功,將導致新的合並提交)。
要只對一個文件進行完整的三向合並,必須在當前提交和您要從中合並一個文件的提交之間選擇一個合並基礎 。 這有點棘手,無論如何通常都是不必要的(請參閱下面的更簡單的checkout -p
方法)。
但是,如果要執行此操作,可以通過git diff --full-index
自動化,通過管道將其git apply -3
到git apply -3
。 合並基礎是您的選擇:您可能希望當前分支的合並基礎和另一個分支的尖端,或者您實際上只是想要提交的父級,實際上就是櫻桃挑選。 根據您獲得的更改,這些最終可能還是會選擇相同的基於合並的文件:
git diff --full-index ...other -- path/to/file
(請注意此處的三個點!這與HEAD...other
含義相同,並且對git diff
特殊含義)或:
git diff --full-index other~1 other -- path/to/file
這些都會產生一個指定文件的差異。 差異中的index
行將提供合並基礎,因此現在您可以添加git apply -3
步驟:
git diff --full-index ...other -- path/to/file | git apply -3
現在,如果可能,您的文件將進行三向合並,如果沒有,則將其留有沖突標記(在這種情況下,請照常解析)。
如果您不需要完整的三向合並,則git checkout -p other -- path/to/file
更簡單。 這樣可以有效地將當前版本的path/to/file
與other
,然后讓您一次將每個更改應用一個“補丁”,即git add -p
。 請注意,這與合並實質上不同。 如果您進行了所有這些更改,則只是git diff other HEAD -- path/to/file | git apply
git diff other HEAD -- path/to/file | git apply
,與git checkout other -- path/to/file
做相同的事情git checkout other -- path/to/file
,這是您所說的不需要的內容 ,因此您必須仔細排除那些不需要的更改。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.