如何有選擇地合併或選擇Git中另外一個分支的更改?

我在一個新項目上使用git,該項目有兩個並行的但目前仍處於試驗階段的開發分支: java

  • master :導入現有的代碼庫以及一些我一般肯定的mod
  • exp1 :實驗分支1
  • exp2 :實驗分支2

exp1exp2表明兩種很是不一樣的體系結構方法。 直到我步入正軌,我才知道哪個(若是有的話)會工做。 當我在一個分支中取得進展時,有時我會進行一些編輯,而這些編輯在另外一分支中將很是有用,而且但願將這些合併。 git

將選擇的更改從一個開發分支合併到另外一個開發分支,同時又保留其餘全部分支的最佳方法是什麼? app

我考慮過的方法: spa

  1. git merge --no-commit而後手動取消暫存我不想在分支之間共享的大量編輯。 命令行

  2. 手動將經常使用文件複製到temp目錄中,而後git checkout移至另外一個分支,而後從temp目錄中進行更多手動複製到工做樹中。 code

  3. 上面的變化。 如今放棄exp分支,並使用另外兩個本地存儲庫進行實驗。 這使得手動複製文件更加簡單。 blog

全部這三種方法彷佛都是乏味且容易出錯。 我但願有更好的方法; 相似於filter path參數,可使git-merge更具選擇性。 索引


#1樓

我遇到了與您上面提到的徹底相同的問題。 可是我在解釋答案時發現這個git博客更加清晰。 ip

來自以上連接的命令: ci

#You are in the branch you want to merge to
git checkout <branch_you_want_to_merge_from> <file_paths...>

#2樓

還有另外一種方法:

git checkout -p

它是git checkoutgit 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.

#3樓

經過這種方法,即便更「簡單」的合併會帶來不少您不但願的更改,也可使歷史記錄僅以最小的麻煩跟蹤另外一個分支中的幾個文件。

首先,您將採起非同尋常的步驟,即預先聲明要提交的內容是合併,而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」分支中應該有多個不一樣的分支。


#4樓

我遇到了與您上面提到的徹底相同的問題。 可是我在解釋答案時發現了這一點

摘要:

  • 從您要合併的分支中籤出路徑,

    $ 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"

#5樓

下面是如何能夠更換Myclass.java文件中master與分支Myclass.javafeature1支。 即便Myclass.javamaster上不存在,它也將起做用。

git checkout master
git checkout feature1 Myclass.java

請注意,這將覆蓋-不會合並-而是忽略master分支中的本地更改。

相關文章
相關標籤/搜索