2015-01-05 258 views
0

我想推動幾個單一提交到一個git遠程回購。我跟傑夫的答案在這裏找到這樣做的:git:推送單個提交,重新排序,重複提交

How can I pushing specific commit to a remote, and not the previous commits?

我要推的提交是不是在頭部,所以我必須用重訂先重新排序提交和我使用這些指令可以這樣做:

http://gitready.com/advanced/2009/03/20/reorder-commits-with-rebase.html

基本上我已經做了:

git clone 
git commit 
git commit 
... 
git pull 
git rebase -i HEAD~3 
git push origin <SHA>:master 

我的錯誤做這個。所以我開始深入研究這個問題。我發現有重複提交在我的日誌,如果我做第二個的git拉墊底之後,例如:

git clone 
git commit 
git commit 
... 
git pull 
git log --pretty=format:"%h - %an : %s" // log before rebasing 
git rebase -i HEAD~3 
git pull 
git log --pretty=format:"%h - %an : %s" // log after rebasing 
git pull 
git log --pretty=format:"%h - %an : %s" // log after rebasing after pulling 

所以我張貼了這個問題:

git: Duplicate Commits After Local Rebase Followed by Pull

羅傑的反應有導致我對於這個問題:爲什麼我會在重新綁定和拉取後看到重複的提交?

從以上,重定基之前的日誌是這樣的:

84e4015 - Me : Local Commit 3 
0dbe86a - Me : Local Commit 2 
d57ba2a - Me : Merge branch 'master' of remote repository 
a86ea35 - Me : Local Commit 1 before reordering 
2fc4fe7 - Remote User 2 : Remote Commit 2 
b7a8656 - Remote User 1 : Remote Commit 1 
8ce80fc - Me : Merge branch 'master' of remote repository 

和日誌墊底後的樣子:

cf1ff7b - Me : Local Commit 3 
cd14463 - Me : Local Commit 2 
b9d44fb - Me : Local Commit 1 after reordering 
9777c56 - Remote User 2 : Remote Commit 2 
a2d7d8b - Remote User 1 : Remote Commit 1 
8ce80fc - Me : Merge branch 'master' of remote repository 

注意,原來的2款2fc4fe7和b7a8656有新的SHA; 9777c56和a2d7d8b。我相信這是問題的開始。

現在,經過我做的是另混帳拉日誌看起來是這樣的:

e8e1a85 - Me : Merge branch 'master' of remote repository 
cf1ff7b - Me : Local Commit 3 
cd14463 - Me : Local Commit 2 
b9d44fb - Me : Local Commit 1 after reordering 
9777c56 - Remote User 2 : Remote Commit 2 
a2d7d8b - Remote User 1 : Remote Commit 1 
2fc4fe7 - Remote User 2 : Remote Commit 2 // duplicate 2 
b7a8656 - Remote User 1 : Remote Commit 1 // duplicate 1 
8ce80fc - Me : Merge branch 'master' of remote repository 

注意,遠程提交,現在複製,和遠程的原有的SHA承諾,2fc4fe7和b7a8656,已經返回。

在羅傑的迴應中,他說這看起來像是其他人推動git的錯,而且他們正在重新調整已經推送的提交。但我相信這是我本地重新推送推送提交的錯。

這是因爲我重新提交了已經推送到遠程的提交嗎?如果是這樣,我應該怎麼做才能避免這種情況?我需要重新提交我的提交,以便我可以推送一個提交。我應該使用分支系統來做到這一點嗎?如果是這樣,我將如何使用分支來解決這個問題?

+0

[Git提交可能重複後重做在同一分支](http://stackoverflow.com/questions/9264314/git-commits-are-duplicated-in-the-same-branch-after - 回合) – Whymarrh

回答

1

簡短的回答是,亞歷山大不更改承諾,而是複製它們。 Git通常會隱藏原件,但是如果原件包含其他用戶共享的原件,那麼您(當然是他們)仍然會看到原件。

作爲一般規則,您應該重新綁定您自己的私人未發佈的提交。由於沒有人其他人有這些定義的副本,因此您製作自己的副本,然後(通過rebase)隱藏您的原件不是問題:您現在可以看到您的副本而不是原件,並且沒有人其他人也可以看到,如果需要,你可以繼續rebase。但是,只要您發佈提交(通過push或類似提交),您就不能再更改它,因爲其他人現在擁有原始副本(包括其SHA-1 ID),並且他們將在以後繼續使用。

你在這種情況下所做的是將自己的提交進行重新署名(即複製)。部分問題源於使用git pull,這意味着「獲取然後合併」,當你想要的是「獲取然後重新分配」。您可以單獨做的步驟:

git fetch 
git rebase 

或使用git pull --rebase

git pull --rebase 

它告訴pull腳本,這樣做的獲取後,它應該做衍合,而不是合併。您也可以配置git自動執行此操作,而不需要參數--rebase

現在的主要問題是你有一個你可能不想要的合併。如果是這樣,您將需要「撤消」合併(與git reset;請參閱其他stackoverflow帖子)。


它不能:一個git對象,包括一個提交,是由它的對象ID,它是其內容的crypographic校驗命名。一個提交由其父代ID,樹的ID,提交的作者和提交者(名稱,電子郵件和時間戳)以及提交消息組成。如果你改變了其中的任何一個,你會得到一個新的,不同的ID提交。

您甚至可以將其配置爲使用git pull --rebase=preserve。但是,保留整個rebase操作的合併是一個單獨的主題(我之前在stackoverflow貼子中已經介紹過)。

+0

有道理,在我閱讀你的答案後,我發現這篇文章:[什麼時候應該使用git pull --rebase?](http://stackoverflow.com/questions/2472254/when-should-我使用的-混帳拉底墊)。它補充了這個答案,並且有幾個答案解釋了什麼是git pull --rebase實際上做的。我會嘗試使用git pull --rebase並將它標記爲答案,如果/當它有效時。謝謝! – Samuel

+0

這明白了。 'git pull --rebase'重新啓動了本地提交,因此它們比遠程回購中的提交更新,即最近。所以當我重新綁定我的提交重新排序時,我不會重新綁定已經推送到遠程倉庫的提交。謝謝! – Samuel