Ich bin gerade dabei, nach a git pull --rebase
. Ich habe einige Dateien mit Zusammenführungskonflikten. Wie kann ich "ihre" Änderungen oder "meine" Änderungen für bestimmte Dateien akzeptieren?
$ 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
Normalerweise öffne ich einfach die Datei oder ein Zusammenführungstool und akzeptiere manuell alle "ihre" oder "meine" Änderungen. Ich vermute jedoch, dass mir ein praktischer Git-Befehl fehlt.
Beachten Sie außerdem, dass ich nur dann eine Zusammenführungsstrategie für jede Datei auswählen kann, wenn ich sehe, welche Dateien Konflikte treffen und möglicherweise welche Konflikte auftreten.
git
git-rebase
git-merge-conflict
Steven Wexler
quelle
quelle
Antworten:
Für jede Konfliktdatei, die Sie erhalten, können Sie angeben
Aus den
git checkout
Dokumentenquelle
git rebase -s recursive -X <ours/theirs>
odergit merge -s recursive -X <ours/theirs>
. Denken Sie daran, dass für eine Rebase "unsere" und "ihre" umgekehrt sind wie bei einer Zusammenführung. Sie könnten wahrscheinlich auch nur einen Datei- / Shell-Glob verwenden, wie zgit checkout --theirs -- *.txt
.ours/theirs
mit Rebase hat mich verrückt gemacht !! (Es macht jetzt Sinn, dass ich darüber nachdenke, wie eine Rebase tatsächlich funktioniert, aber überhaupt nicht intuitiv.)git checkout --outs -- "**/*.csproj"
das tun, was Sie meinen. Gleiches gilt zB fürgit lfs track "*.jpg"
. Wenn Sie einige JPG-Dateien in Ihrem CWD haben, ohne die Anführungszeichen, werden nur diese verfolgt.Auch wenn diese Frage beantwortet wird, geben Sie ein Beispiel dafür, was "ihre" und "unsere" im Fall von Git Rebase vs Merge bedeuten. Siehe diesen Link
Git Rebase
theirs
ist im Falle von Rebase der aktuelle Zweig . Die folgenden Befehle akzeptieren also tatsächlich Ihre aktuellen Zweigänderungen über den Remote-Zweig.Git Merge
Beim Zusammenführen wird die Bedeutung von
theirs
undours
umgekehrt. Um den gleichen Effekt während einer Zusammenführung zu erzielen , behalten Sie Ihre aktuellen Zweigänderungen (ours
) über dem zusammengeführten Remote-Zweig (theirs
) bei.quelle
Beachten Sie, dass
git checkout --ours|--theirs
werden die Dateien vollständig überschreiben , indem Sie entwedertheirs
oderours
Version, die möglicherweise oder möglicherweise nicht , was Sie tun wollen (wenn Sie nicht-Konflikt Änderungen haben von der anderen Seite kommen, werden sie verloren).Wenn Sie stattdessen einen Drei-Wege - Merge auf die Datei ausführen möchten, und lösen nur die konflikt große Stücke mit
--ours|--theirs
, während halten nicht-Konflikt große Stücke von beiden Seiten an Ort und Stelle ist , sollten Sie greifen aufgit merge-file
; Details finden Sie in dieser Antwort .quelle
example.txt
in derours
Version zwei geänderte Hunks (Teile) , eines ist in Konflikt geraten (auch in dertheirs
Revision geändert ), das andere ist nicht in Konflikt geraten. Wenn Sie dies tungit checkout --theirs example.txt
, wird bei dertheirs
Überarbeitung nur blind die gesamte Datei gelesen , und der nicht konfliktreiche Teil des Diff geht verloren.git checkout --merge <path>
.