2011-08-29 238 views
15

我不認爲這是可能的,但認爲有人可能有一個漂亮的想法,如何實現這一點:讓git永不推送單個提交?

我有一個項目,我檢查了很久之前,我接管了它。我對各種文件進行了大約十次更改,這些更改是我從不想檢入的(它們都是配置更改)。

有什麼辦法來提交這組更改,然後從來沒有實際推送那個提交嗎?我知道這聽起來很奇怪:)

澄清:

我想這些變化留在我的工作目錄,我需要他們的應用程序在本地運行。我希望能夠保持提交它們周圍的其他變動,在同一個文件甚至變化,但從來沒有推配置更改其他地方...

這有點像以前那樣每推我會想:

  • 櫻桃採摘和藏匿這一承諾
  • 變基的一個犯了
  • 這個藏匿重新應用到我的代碼庫

回答

18

這是一種類似的模式,可以將本地補丁集保存到您不控制的上游項目中。處理這種情況最簡單的方法是讓所有的改變打通合併,像這樣的中間分支:

___________________________ master 
\__________________________ config-changes 
    \_____________________ daily-work 

master包含一切,是被共享。在config-changes中唯一承諾的內容是您希望能夠在共享時輕鬆恢復的更改。 daily-work是你做的所有工作的分支設置它,這樣做:

# (no local config changes should be in master at this point) 
git checkout -b config-changes master 
# Make your config-related changes that you don't want to share 
git commit -am "Made local config changes" 
git checkout -b daily-work 
# Work and commit like normal 

當你準備好分享您的更改,這樣做:

git rebase --onto master config-changes daily-work 
git checkout master 
git merge daily-work 

這將恢復所有的變化在config-changes中製作,但除此之外使它看起來像你從master直接分支。請注意,在完成此重新分配之後,如果您想繼續使用daily-work,則需要將其重新分配到config-changes,但最好爲每個更改創建一個新分支。

當你需要從master拉下新的變化,這樣做:

git checkout master 
git pull 
git checkout config-changes 
git merge master 

合併重新應用本地配置的變化到最新的高手。然後,您可以根據需要自由創建新的daily-work分支,或將config-changes合併到舊分支中。基本上,您絕不會直接從master合併到daily-work。你總是先通過config-changes

起初看起來很多工作,但是一旦你做了一次或兩次,你會發現它比手動維護更改要容易得多。

+0

真棒,這正是我正在尋找/希望的。謝謝! –

+0

這非常有幫助。謝謝! – Pat

+0

SmartGit有一個名爲「Interactive Rebase」的功能,可讓您輕鬆上下移動提交。對於這種情況,在對話框中向上移動「config-changes」提交最容易。然後,只需在「config-changes」之前提交即可。作爲避免意外推送我的臨時提交的預防措施,我在提交消息中添加了一個「TMP:」前綴,然後添加了一個本地push-hook來在我意外推送我的臨時提交時發出警告。 – Ryuu

0

啊,就創建一個單獨的分支,有儲存這些變化:

git checkout -b your-new-branch 
git commit -a 

你完成提交後,就回到原來的分支,而忘記了這些變化。

+0

我認爲他想要他現在正在研究的分支的變化。回去會刪除更改。 – manojlds

+0

我想要我的本地代碼庫中的更改。即我希望他們都在我的工作目錄中,我永遠不希望他們被推到任何地方。如果我在分支中這樣做,我不會看到我將如何訪問這些更改以及我想要推送的更改。 –

+0

可能是這種情況。我會等待cwolves澄清。 –

3

對這些文件使用git update-index --assume-unchanged使git認爲這些文件沒有被修改。

評論之後,另一種選擇是有一個單獨的分支,你推。在這個分支的承諾是櫻桃採摘等從工作分支。所以,當你想推動,切換到「推」分支,櫻桃選擇提交從「工作」,並推動。

+0

如果我正確閱讀文檔,這與'git ignore'類似? –

+0

@cwolves - 這是爲了「忽略」對已經被跟蹤的文件的改變。 'git ignore'用於忽略回購庫中的文件。 – manojlds

+0

啊,gotcha。謝謝,但不是我所需要的 - 我需要能夠稍後提交到一個文件,但不是我之前做的更改......我正在研究一個項目,其中「配置」分散在十幾個文件中我還需要稍後修改。理想情況下,我會將所有這些合併成一個/幾個配置文件,但它與所有需要半天時間的事情緊密相關...... –