2013-05-08 53 views
9

這個問題的短版本是這樣的:我怎麼能彈出git藏而不觸發自動合併?如何彈出混帳藏而不觸發自動合併


現在對於更長的版本...

考慮替代git stash ... + git pull ... + git pop以下玩具的例子。

首先,git status表明工作目錄中的唯一修改是針對某個跟蹤文件foo

# On branch master 
# Changes not staged for commit: 
# (use "git add <file>..." to update what will be committed) 
# (use "git checkout -- <file>..." to discard changes in working directory) 
# 
# modified: foo 
# 
no changes added to commit (use "git add" and/or "git commit -a") 

現在,爲了工作目錄重置爲乾淨的狀態,作爲一個先決條件運行git pull,我暫時命名修改後的文件foo(一些未經跟蹤的名稱),並恢復foo版本在HEAD ...

% mv foo foo.$(date +%Y%m%dT%H%M%S) 
% git checkout foo 
% git status 
# On branch master 
# Untracked files: 
# (use "git add <file>..." to include in what will be committed) 
# 
# foo.20130508T110014 
nothing added to commit but untracked files present (use "git add" to track) 

OK,現在我跑git pull,這對於這個例子來說,我們可以假設是快進:

% git pull 

最後,我還原了臨時更名爲foo

% mv foo.20130508T110014 foo 

...我又回到

% git status 
# On branch master 
# Changes not staged for commit: 
# (use "git add <file>..." to update what will be committed) 
# (use "git checkout -- <file>..." to discard changes in working directory) 
# 
# modified: foo 
# 

這是「道德等價物」一git stash save + git pull + git stash pop的,不同的是前者,而不是後者,都難「合併衝突」,像這樣的:

% git stash save 'WIP' 
% git pull 
% git stash pop 
Auto-merging foo 
CONFLICT (content): Merge conflict in foo 

我怎樣才能複製rename-checkout-pull-rename序列上方使用git stash save + ... + git stash pop沒有觸發自動合併?

編輯:順便說一句,rename-checkout-...-rename程序更加緊密地代表着什麼我期望從一個命令調用stash。 IOW:現在保存我的工作目錄的狀態,並稍後替換它。 這張圖中沒有「合併」。

+3

這不等於道德。如果你隱藏彈出窗口,更改將被合併。如果您將文件恢復到原來的位置,則原始存儲庫中發生的任何更改都將丟失並被您的文件版本覆蓋。 – knittl 2013-05-08 15:43:07

+0

我不知道你爲什麼重命名的提交和所有這些看到我的答案在這裏http://stackoverflow.com/questions/16180916/git-three-different-repositories-with-common-files/16181046#16181046希望它可以幫助 – uday 2013-05-08 15:43:42

+0

@uDaY:我無法找到如何避免自動合併的答案。 – kjo 2013-05-08 16:51:30

回答

3

我遲遲沒有意識到,git已經提供了一個非常簡單的解決方案來解決激發這個問題的問題(即自動合併可能會將存儲庫置於「未合併狀態」)。

所有需要做的就是用

git stash branch <branchname> [<stash>] 

,而不是git stash pop(或git stash apply)。

這會彈出儲存方式,保證沒有衝突。 易pe檸檬榨汁

+0

生成的分支也沒有任何提交的提交。 – jthill 2014-02-08 22:44:08

+1

@jthill:的確如此。現在有了一些後見之明,我發現在這個問題的根源上,對於'git stash'函數的天真理解是:「放棄我的工作,做別的事情,並*回到我所在的位置」。這個幼稚的圖片發現後發現,例如,「藏起來」後的「git pull」可能會導致無法「回到」我剛纔使用的簡單的「git pop」:可能會有衝突解決。所以我正在尋求一種「回來」的方式。後來我意識到,實現這一目標的最簡單方法是創建一個分支作爲安全,... – kjo 2014-02-08 22:58:17

+0

...無衝突現貨來彈出存儲。在探索這個想法的同時,我發現'git'已經有了這個功能。我想我之前錯過了它,因爲我不太瞭解'git'分支,並且對它們不太舒服。 (我仍然完全不理解分支,但我認爲現在比以前更瞭解他們!) – kjo 2014-02-08 23:00:51

1

OK,運行到這樣的事情後:

% git stash pop 
Auto-merging foo 
CONFLICT (content): Merge conflict in foo 
Auto-merging bar 
CONFLICT (content): Merge conflict in bar 
Auto-merging baz 
CONFLICT (content): Merge conflict in baz 
... 

# $#@?!?!%$!*@#... 

...我已經管理的最佳解決方案拿出來是這個迴應:

% git checkout --theirs $(git diff --name-only --diff-filter=U) 
% git reset 
% git stash drop 

(在this answer爲主。)

+1

爲什麼還要在這一點上埋頭苦幹?您只是放棄所有更改。 – 2013-05-08 22:05:16

+0

不,我不是。我測試過了。以上是好的。 – kjo 2013-05-08 22:21:03

+0

對不起,「你的」我的意思是來自服務器的變化,而不是你存儲的變化。這措辭不好。 – 2013-05-09 21:58:16

3

stash合併,這就是它是如何工作的。

您可以使用write-treeread-treecheckout-index來實現非合併-y存儲。 Here's a worked example for doing this to achieve a pristine test environment

只需蠻力的一個不合並隱藏應用,你可以例如

git read-tree stash^{tree} 
git checkout-index -af 
+0

謝謝,儘管我承認在示例中的'git'代碼過得幾英里以上我的頭......這當然不是清楚,我認爲它優於三線的解決方案我貼(其中,不可否認,是一個黑客)。 – kjo 2013-05-08 22:02:37

+0

目前尚不清楚對我來說,無論是 - 做一次性合併,然後解開傷害一個真正的優勢在熟悉,學習使用讀取樹和寫樹和結帳指數有它自己的。我所鏈接的是一種不同的情況,在這裏調整它會產生一個更簡單的順序。基本上我只是離開面包屑,我發現學習低級命令是有益的,並且非常容易。事實證明,git的核心非常簡單,但進入這些東西有一點點後勁。 – jthill 2013-05-08 22:34:18

+0

我與你:我所有的直去的管道,但我的混帳福現在還沒有...的'git的結帳...'方法只是稍微* *少莫測我在時刻。 AFAICT,這兩種方法之間的唯一淨差額是與'git的結帳...''方法ORIG_HEAD'最終指向'HEAD〜',而你的方法它最終指向'HEAD'。 – kjo 2013-05-09 21:36:42

2

您看到一個合併衝突,這意味着有一個在foo文件,您從服務器拉的變化。因此,將文件複製並移回將完全破壞foo文件中回購的所有更改。如果你犯了這個錯誤,那麼承諾修改foo的其他人會恨你。

你的問題的答案取決於你想要完成的。您是否試圖查看服務器上的更改與您的代碼進行了比較?在完成之前,你是否試圖避免處理其他人的代碼?

如果您只想查看分支所做的更改,則可以使用git fetch而不是git pull,然後將您當前的代碼與該代碼進行比較。或者,如果您現在不想合併您的更改,請考慮在單獨的分支中工作,或者直到您準備好合併爲止。

+0

我不明白你的問題,因爲我已經發布了一個明確無誤地解釋我「試圖完成」的解決方案。 – kjo 2013-05-09 20:32:31

+0

@kjo我不知道你要完成的原因是,你所描述的(無論是在你原來的職位,並在您的解決方案)的過程中會導致你撤消文件等的變化,而不審查他們。其中,如果你完全知道你的過程可能沒問題。但是你的描述說你的過程是存儲命令的「道德等價物」,這表明你並不清楚你的過程會造成的損害。 – 2013-05-09 21:54:31

+0

@kjo在您的版本中,服務器上的文件可能有任何更改。如果這些更改中的單個更改發生衝突,而不是解決衝突,那麼您將丟棄文件中的所有更改,以支持可能過時的文件版本。這可能會導致很多令人頭疼的問題,因爲人們認爲實施的修復方案突然間不在最新版本中。 – 2013-05-09 21:57:35