Jestem w trakcie rebasingu po git pull --rebase
. Mam kilka plików, które mają konflikty scalania. Jak mogę zaakceptować „ich” zmiany lub „moje” zmiany dla określonych plików?
$ git status
# Not currently on any branch.
# You are currently rebasing.
# (fix conflicts and then run "git rebase --continue")
# (use "git rebase --skip" to skip this patch)
# (use "git rebase --abort" to check out the original branch)
#
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# modified: CorrectlyMergedFile
#
# Unmerged paths:
# (use "git reset HEAD <file>..." to unstage)
# (use "git add <file>..." to mark resolution)
#
# both modified: FileWhereIWantToAcceptTheirChanges
# both modified: FileWhereIWantToAcceptMyChanges
Zwykle po prostu otwieram plik lub narzędzie do scalania i ręcznie akceptuję wszystkie „ich” lub „moje” zmiany. Podejrzewam jednak, że brakuje mi wygodnego polecenia git.
Zauważ też, że będę mógł wybrać strategię scalania dla każdego pliku tylko wtedy, gdy zobaczę, które pliki uderzają w konflikty i być może takie są konflikty.
git
git-rebase
git-merge-conflict
Steven Wexler
źródło
źródło
Odpowiedzi:
Dla każdego otrzymanego pliku będącego w konflikcie możesz określić
Z
git checkout
dokumentówźródło
git rebase -s recursive -X <ours/theirs>
lubgit merge -s recursive -X <ours/theirs>
. Należy pamiętać, że w przypadku bazy „nasze” i „ich” są odwrócone od tego, czym są podczas łączenia. Prawdopodobnie możesz po prostu użyć globu pliku / powłoki, npgit checkout --theirs -- *.txt
.ours/theirs
z rebase doprowadzało mnie do szaleństwa !! (Teraz myślę o tym, jak działa rebase, ale wcale nie jest intuicyjny).git checkout --outs -- "**/*.csproj"
zrobisz to, co masz na myśli. To samo dotyczy npgit lfs track "*.jpg"
. Jeśli masz jakieś pliki jpg w swoim CWD, bez cudzysłowów, tylko te będą śledzone.Pomimo odpowiedzi na to pytanie, stanowi przykład tego, co „ich” i „nasze” oznaczają w przypadku git rebase vs scalanie. Zobacz ten link
Git Rebase
theirs
jest tak naprawdę aktualną gałęzią w przypadku rebase . Tak więc poniższy zestaw poleceń akceptuje bieżące zmiany gałęzi w oddziale zdalnym.Git Merge
W przypadku scalania znaczenie
theirs
iours
jest odwrócone. Tak więc, aby uzyskać ten sam efekt podczas scalania , tzn. Zachowaj bieżące zmiany gałęzi (ours
) nad łączoną gałęzią zdalną (theirs
).źródło
Zauważ, że
git checkout --ours|--theirs
będzie nadpisać pliki całkowicie , wybierając albotheirs
alboours
wersja, która może być lub może nie być, co chcesz zrobić (jeśli masz jakiekolwiek zmiany nie kolidowały pochodzących z drugiej strony, zostaną one utracone).Jeśli zamiast tego chcesz wykonać trzykrotne scalenie pliku i rozwiązywać tylko konfliktowe porcje za pomocą
--ours|--theirs
, zachowując bezkonfliktowe porcje po obu stronach, możesz skorzystać zgit merge-file
; zobacz szczegóły w tej odpowiedzi .źródło
example.txt
wours
wersji jedno jest skonfliktowany (też zmienić wtheirs
rewizji), drugi to nie kolidowały. Jeśli to zrobiszgit checkout --theirs example.txt
, po prostu ślepo odczyta cały plik podczastheirs
rewizji, a niezróżnicowana część diff zostanie utracona.git checkout --merge <path>
.