我在一個新項目上使用git,該項目有兩個並行的但目前仍處於試驗階段的開發分支: java
master
:導入現有的代碼庫以及一些我一般肯定的mod exp1
:實驗分支1 exp2
:實驗分支2 exp1
和exp2
表明兩種很是不一樣的體系結構方法。 直到我步入正軌,我才知道哪個(若是有的話)會工做。 當我在一個分支中取得進展時,有時我會進行一些編輯,而這些編輯在另外一分支中將很是有用,而且但願將這些合併。 git
將選擇的更改從一個開發分支合併到另外一個開發分支,同時又保留其餘全部分支的最佳方法是什麼? app
我考慮過的方法: spa
git merge --no-commit
而後手動取消暫存我不想在分支之間共享的大量編輯。 命令行
手動將經常使用文件複製到temp目錄中,而後git checkout
移至另外一個分支,而後從temp目錄中進行更多手動複製到工做樹中。 code
上面的變化。 如今放棄exp
分支,並使用另外兩個本地存儲庫進行實驗。 這使得手動複製文件更加簡單。 blog
全部這三種方法彷佛都是乏味且容易出錯。 我但願有更好的方法; 相似於filter path參數,可使git-merge
更具選擇性。 索引
我遇到了與您上面提到的徹底相同的問題。 可是我在解釋答案時發現這個git博客更加清晰。 ip
來自以上連接的命令: ci
#You are in the branch you want to merge to git checkout <branch_you_want_to_merge_from> <file_paths...>
還有另外一種方法:
git checkout -p
它是git checkout
和git add -p
的混合,可能正好是您要查找的內容:
-p, --patch Interactively select hunks in the difference between the <tree-ish> (or the index, if unspecified) and the working tree. The chosen hunks are then applied in reverse to the working tree (and if a <tree-ish> was specified, the index). This means that you can use git checkout -p to selectively discard edits from your current working tree. See the 「Interactive Mode」 section of git-add(1) to learn how to operate the --patch mode.
經過這種方法,即便更「簡單」的合併會帶來不少您不但願的更改,也可使歷史記錄僅以最小的麻煩跟蹤另外一個分支中的幾個文件。
首先,您將採起非同尋常的步驟,即預先聲明要提交的內容是合併,而git根本不對工做目錄中的文件作任何事情:
git merge --no-ff --no-commit -s ours branchname1
。 。 。 其中「分支名稱」是您聲稱要合併的內容。 若是您當即提交,則不會進行任何更改,但仍會顯示來自另外一個分支的祖先。 您能夠添加更多分支/標籤/等。 若是須要,也可使用命令行。 可是,此時沒有要提交的更改,所以接下來從其餘修訂版獲取文件。
git checkout branchname1 -- file1 file2 etc
若是要從多個分支合併,請根據須要重複。
git checkout branchname2 -- file3 file4 etc
如今,來自另外一個分支的文件已包含在索引中,隨時能夠提交,並帶有歷史記錄。
git commit
而且您將在該提交消息中進行不少說明。
可是請注意,以防萬一,這是很麻煩的事情。 這並非出於「分支」的目的,而在這裏摘櫻桃是一種更誠實的方式來作您想作的事情。 若是您想對上次未帶過的同一分支上的其餘文件進行另外一次「合併」,則會顯示「已經更新」消息,從而阻止您。 這是咱們不該該分支時的一種症狀,在「 from」分支中應該有多個不一樣的分支。
我遇到了與您上面提到的徹底相同的問題。 可是我在解釋答案時發現了這一點 。
摘要:
從您要合併的分支中籤出路徑,
$ git checkout source_branch -- <paths>...
提示:也能夠在沒有連接的狀況下使用--
就像在連接文章中看到的那樣。
或有選擇地合併大塊
$ git checkout -p source_branch -- <paths>...
或者,使用reset,而後添加選項-p
,
$ git reset <paths>... $ git add -p <paths>...
最後提交
$ git commit -m "'Merge' these changes"
下面是如何能夠更換Myclass.java
文件中master
與分支Myclass.java
的feature1
支。 即便Myclass.java
在master
上不存在,它也將起做用。
git checkout master git checkout feature1 Myclass.java
請注意,這將覆蓋-不會合並-而是忽略master分支中的本地更改。