正如在這個問題中所要求的那樣 ,我也想知道如何解決衝突的git stash pop
而不添加對提交的全部修改(就像「git stash pop」而沒有衝突)。 git
我目前的方法很是不酷,由於我這樣作: vim
git stash pop -> CONFLICT git stash drop [resolve conflict] [add conflict files] git reset HEAD <all files that are in commit-mode>
[更新]一種重現它的方法: 併發
mkdir foo; cd foo; git init echo "1" > one echo "2" > two git add -A; git commit -m "first" echo "1.1" > one echo "2.1" > two git stash echo "2.2" > two git commit -a -m "second" echo "Only this file would stay in HEAD without the conflict" > third git add third git stash pop git status
2016-06-27:在示例中添加了一個名爲「third」的新文件,以顯示scy解決方案的解決方法僅適用於空HEAD,但不解決HEAD不具備相同內容的初始問題對於沒有衝突的git stash pop
。 app
假設您有這種狀況,您能夠隱藏更改以從原點拉出。 多是由於您的本地更改只是debug: true
在某些設置文件中爲debug: true
。 如今你拉,有人在那裏引入了新的設置,形成了衝突。 工具
git status
說: this
# On branch master # Unmerged paths: # (use "git reset HEAD <file>..." to unstage) # (use "git add/rm <file>..." as appropriate to mark resolution) # # both modified: src/js/globals.tpl.js no changes added to commit (use "git add" and/or "git commit -a")
好的。 我決定採用Git的建議:我解決了衝突並承諾: spa
vim src/js/globals.tpl.js # type type type … git commit -a -m WIP # (short for "work in progress")
如今個人工做副本處於我想要的狀態,可是我建立了一個我不想擁有的提交。 如何在不修改個人工做副本的狀況下襬脫該提交? 等等,有一個流行的命令! .net
git reset HEAD^
個人工做副本還沒有更改,但WIP提交已消失。 這正是我想要的! (注意我在這裏沒有使用--soft
,由於若是你的存儲中有自動合併的文件,它們會自動暫存,所以你最終會在reset
後再次暫存這些文件。) 命令行
可是還剩下一件事: git stash pop
的手冊頁提醒咱們「應用狀態會因衝突而失敗;在這種狀況下,它不會從存儲列表中刪除。你須要手動解決衝突並調用git stash drop
以後手動git stash drop
。「 這正是咱們如今所作的: debug
git stash drop
並作了。
git stash branch
將工做,它會爲您建立一個新分支,檢查您在保存工做時所處的提交,在那裏從新應用您的工做,而後在成功應用時刪除存儲。 檢查一下
git checkout stash -- .
爲我工做。
注意 :這可能很危險,由於它不會嘗試將存儲中的更改合併到工做副本中,而是使用存儲文件覆蓋它。 所以,您可能會丟失未提交的更改。
好吧,你能夠關注他們:)。 但我不認爲執行提交而後重置分支以刪除該提交和其餘答案中建議的相似解決方法是解決此問題的乾淨方法。
如下解決方案彷佛對我來講更清晰, Git自己也提出了這個解決方案 - 嘗試在存儲庫中執行git status
併發生衝突:
Unmerged paths: (use "git reset HEAD <file>..." to unstage) (use "git add <file>..." to mark resolution)
那麼讓咱們作Git建議的事情(不作任何無用的提交):
git reset
將衝突標記爲已解決並取消暫停更改。 您能夠在沒有任何參數的狀況下執行它,Git將從索引中刪除全部內容。 您沒必要在執行git add
以前。 git stash drop
刪除存儲,由於Git在衝突時不會這樣作。 轉換爲命令行:
$ git stash pop # ...resolve conflict(s) $ git reset $ git stash drop
有兩種方法能夠將衝突標記爲已解決: git add
和git reset
。 雖然git reset
將衝突標記爲已解決並從索引中刪除文件,但git add
還會將衝突標記爲已解決,但會將文件保留在索引中。
解決衝突後將文件添加到索引是故意的。 這樣,您能夠區分更改與先前存儲的更改以及解決衝突後所作的更改。 若是您不喜歡它,您能夠隨時使用git reset
從索引中刪除全部內容。
我強烈建議使用任何3路合併工具來解決衝突,例如KDiff3 , Meld等,而不是手動執行。 它一般自動解決全部或大多數衝突。 節省大量時間!
根據git stash問題 ,在解決衝突後, git add <file>
是正確的行動方案。
在閱讀此評論後 ,我瞭解到更改會自動添加到索引中(按設計)。 這就是git add <file>
完成衝突解決過程的緣由。