Аз съм изправен пред конфликт на сливане. Как мога да прекъсна сливането?
Използвах git pull
и имах конфликт:
unmerged: _widget.html.erb You are in the middle of a conflicted merge.
Знам, че другата версия на файла е добра и шахмата ми, така че всичките ми промени трябва да бъдат отменени. Как мога да направя това?
Тъй като pull
ви е било неуспешно, тогава HEAD
(не HEAD^
) е последният „валиден“ ангажимент във вашата тема:
git reset --hard HEAD
Другата част, която искате, е да позволите промените да надхвърлят промените ви.
По-старите версии на git ви позволяват да използвате стратегията за сливане "тях":
git pull --strategy=theirs remote_branch
Но оттогава той е премахнат, както е описано в този пост от Junio Hamano (придружаващ git). Както е посочено в връзката , ще направите следното:
git fetch origin git reset --hard origin
Ако вашата версия на git е> 1.6.1, можете да използвате git reset --merge
.
Освен това, както споменава @Michael Johnson, ако вашата версия на git е> 1.7.4, можете също да използвате git merge --abort
.
Както винаги, преди да започнете сливане, уверете се, че нямате непозволени промени.
На страницата за мъже в git сливане

git merge --abort
еквивалентно на git reset --merge
когато MERGE_HEAD
присъства.
MERGE_HEAD
присъства при сливане.
Също така, по отношение на неприети промени при започване на обединяване:
Ако имате промени, които не искате да направите, преди да започнете сливане, просто ги ги git stash
преди сливането и git stash pop
след сливането е завършено или отменено.
git merge --abort
Прекъснете текущия процес на разрешаване на конфликти и се опитайте да възстановите състоянието преди сливането.
Ако имаше неработни промени в работната ситуация, които бяха налице при
git merge --abort
на сливането,git merge --abort
в някои случаи няма да може да възстанови тези промени. Затова е препоръчително винаги да записвате или записвате промените, преди да стартирате git merge.
git merge --abort
еквивалентно наgit reset --merge
когатоMERGE_HEAD
.
В този конкретен случай на употреба наистина не искате да прекъснете сливането, просто разрешете конфликта по определен начин.
Няма специална нужда да се рестартират и сливат с друга стратегия. Конфликтите бяха правилно разпределени с git и изискването за приемане на промени от трети страни е само за този един файл.
За несвързан файл в конфликт, git осигурява достъпна обща база, локални и отдалечени версии на файла в индекса. (Тук те се четат за използване в тристранния инструмент diff с git mergetool
.) Можете да използвате git show
да ги видите.
# common base: git show :1:_widget.html.erb # 'ours' git show :2:_widget.html.erb # 'theirs' git show :3:_widget.html.erb
Най-лесният начин за разрешаване на конфликт е използването на отдалечената версия:
git show :3:_widget.html.erb >_widget.html.erb git add _widget.html.erb
Или с git> = 1.6.1:
git checkout --theirs _widget.html.erb
Мисля, че трябва git reset
.
Имайте предвид, че git revert
означава нещо много различно от, да кажем, svn revert
- в Subversion, връщането ще отхвърли вашите (необвързани) промени, връщайки файла на текущата версия от хранилището, докато git revert
"отменя" коммита.
git reset
трябва да направи еквивалента на svn revert
, т.е. да изхвърли нежеланите промени.
Тъй като коментарите приемат, че git reset --merge
е псевдоним за git merge --abort
, заслужава да се отбележи, че git merge --abort
еквивалентно на git reset --merge
само ако има MERGE_HEAD
. Това може да бъде намерено в git help за командата за обединяване.
git merge --abort is equivalent to git reset --merge when MERGE_HEAD is present.
След неуспешно сливане, когато няма MERGE_HEAD
, неуспешното сливане може да бъде отменено с git reset --merge
, но не задължително с git merge --abort
, така че те не са само стари и нови синтаксиси за едно и също нещо .
Лично аз намирам git reset --merge
много по-мощен за сценарии като описания и неуспешните сливания като цяло.
Тъй като Git 1.6.1.3 git checkout
състояние да провери от двете страни на сливането:
git checkout --theirs _widget.html.erb
Алтернатива на запазването на състоянието на работно копие е:
git stash git merge --abort git stash pop
Обикновено не препоръчвам това, защото той е също толкова ефективен, колкото и сливането в Subversion, тъй като отхвърля връзката на разклонението в следващия ангажимент.
И ако прекратите конфликта за сливане и нямате никакви неща, за да се ангажирате, грешката при сливането се показва след прилагане на всички следващи команди,
git reset --hard HEAD git pull --strategy=theirs remote_branch git fetch origin git reset --hard origin
премахнете
.git index.lock
файл [прекъснете поставянето на друго място в случай на възстановяване] и след това въведете някоя от следните команди в зависимост от желаната версия.
git reset --hard HEAD git reset --hard origin
Надявам се това да помогне!
Намерих това, което работи за мен (връщане на един файл в състоянието преди сливането):
git reset *currentBranchIntoWhichYouMerged* -- *fileToBeReset*
Други въпроси относно етикетите git -control git-merge разрешаване на конфликти git-conflict-resolution или Ask a Question