2013-02-14 76 views
7

所以,假設我有一個主分支,我們將調用'master'。我做了一個叫'新功能'的分支。我在這個分支中做了大量的提交,所以我可以及時回溯,但是在開發這個功能的時候,我已經做了很多事情,所以提交日誌非常混亂。Git分支差異到一個新的提交

如果我想看看 git diff master..new-feature 例如。

如果我想在'master'上創建一個包含兩個分支之間所有更改的新鮮提交,那麼最有效的方法是什麼?

回答

17
git checkout master 
git merge --squash new-feature 
git commit 

的提交信息開始時會顯示提交是 的整個列表合併/壓扁,但你當然可以編輯的,要成爲任何你想要的。

+0

美味簡單:) – hhh 2013-02-14 22:25:05

1

您可以使用交互式底線:git rebase --interactive。然後只需使用壓扁選項。它只使用來自提交的更新,但不創建提交。

+0

這似乎是更換挑選南瓜一噸搜索,還是我錯過了什麼? – hhh 2013-02-14 21:59:10

0

您可以在您的功能分支中提交所有內容,然後合併到接受所有更改的「主題」中。

這裏有一個堆棧溢出問題,就如何做一個偉大的回答: Is there a "theirs" version of "git merge -s ours"?

+0

嗯,這是否只會導致一個代表功能分支的提交? – hhh 2013-02-14 22:01:03

+0

如果你首先在特徵分支中重新綁定(就像上面的William所說的那樣),但這可能是不可取的。關於源代碼管理的一件偉大的事情就是具有你如何到達你的位置的歷史。我想這是一個偏好問題!更多關於交互式rebase [here](http://gitready.com/advanced/2009/02/10/squashing-commits-with-rebase.html)。 – 2013-02-14 22:15:21

+0

是的,我希望有歷史記錄,但不同的人:) – hhh 2013-02-14 22:29:02

1

使用git變基--interactive HEAD〜(然而,許多提交想壁球)。例如,git rebase --interactive HEAD〜5。這會加載你最近的5次提交,並彈出一個編輯窗口。每條消息在開始時都會有「挑選」。回到最後一條消息,將'pick'改爲'squash'然後退出。將打開一個新窗口詢問提交消息。這將是squash提交的新提交消息。退出並將壓縮所有提交到一個新的。

這裏有一個例子: https://ariejan.net/2011/07/05/git-squash-your-latests-commits-into-one

+0

看起來像這樣可能會產生一些問題,看到我在一個團隊中,並經常需要從其他團隊成員拉動變化。那,我寧可不計數:) – hhh 2013-02-14 21:58:47

+0

如果你正在研究一個新功能的分支,我假設你正在自己的分支上工作。如果你不是,你/你在工作的其他人可能有自己的分支機構。如果其他人已經提取代碼,使用rebase通常是一個糟糕的主意,因爲它可能會導致問題,因爲您正在重寫歷史記錄 – 2013-02-14 22:00:54

+0

因此,〜5不會計算我已經提取的主人提交的提交只要我是分支機構中唯一承諾的人? '5'是指最後五個獨立於該分支,還是最後五個提交? – hhh 2013-02-14 22:03:00

2

另一個可能對您更好的選擇是生成一個帶有git diff --patch > "patch filename"的補丁文件,然後使用git apply "patch file name"將它們修補到您的主分支中。對於GIT-DIFF

手冊頁(尤其是 「生成與-p補丁」): http://www.kernel.org/pub/software/scm/git/docs/git-diff.html

的手冊頁git的申請: http://www.kernel.org/pub/software/scm/git/docs/git-apply.html

+0

git apply ...有趣:)很高興知道! – hhh 2013-02-16 02:23:08