Einfaches Werkzeug, um 'ihre' anzunehmen oder 'meine' für eine ganze Datei mit git zu akzeptieren


Answers

Basierend auf Jakubs Antwort können Sie folgende git Aliase konfigurieren:

accept-ours = "!f() { git checkout --ours -- \"${@:-.}\"; git add -u \"${@:-.}\"; }; f"
accept-theirs = "!f() { git checkout --theirs -- \"${@:-.}\"; git add -u \"${@:-.}\"; }; f"

Sie nehmen optional einen oder mehrere Pfade von Dateien zum Auflösen und Standard zum Auflösen von allem unter dem aktuellen Verzeichnis auf, wenn keines angegeben wird.

Fügen Sie sie dem Abschnitt [alias] Ihrer ~/.gitconfig oder führen Sie sie aus

git config --global alias.accept-ours '!f() { git checkout --ours -- "${@:-.}"; git add -u "${@:-.}"; }; f'
git config --global alias.accept-theirs '!f() { git checkout --theirs -- "${@:-.}"; git add -u "${@:-.}"; }; f'
Question

Ich möchte kein visuelles Merge-Tool, und ich möchte auch nicht die konfliktierte Datei vi haben und manuell zwischen HEAD (mine) und der importierten Änderung (theirs) wählen. Die meiste Zeit möchte ich entweder alle ihre Änderungen oder alles von mir. Gewöhnlich ist das, weil meine Änderung es upstiam machte und zu mir durch einen Zug zurückkommt, aber an einigen Stellen leicht geändert werden kann.

Gibt es ein Kommandozeilen-Tool, das die Konfliktmarker loswerden und auf die eine oder andere Art auswählen wird? Oder eine Reihe von Git-Befehlen, die ich selbst alias machen kann.

# accept mine
alias am="some_sequence;of;commands"
alias at="some_other_sequence;of;commands"

Dies ist eher ärgerlich. Für "akzeptiere meins" habe ich versucht:

randy@sabotage ~/linus $ git merge test-branch
Auto-merging Makefile
CONFLICT (content): Merge conflict in Makefile
Automatic merge failed; fix conflicts and then commit the result.

randy@sabotage ~/linus $ git checkout Makefile 
error: path 'Makefile' is unmerged

andy@sabotage ~/linus $ git reset --hard HEAD Makefile 
fatal: Cannot do hard reset with paths.

Wie soll ich diese Änderungsmarker loswerden?

Ich kann:

git reset HEAD Makefile; rm Makefile; git checkout Makefile

Aber das scheint ziemlich rund zu sein, es muss einen besseren Weg geben. Und an diesem Punkt bin ich mir nicht sicher, ob Git überhaupt denkt, dass die Zusammenführung passiert ist, also glaube ich nicht, dass dies notwendigerweise sogar funktioniert.

Gehen Sie in die andere Richtung, tun "akzeptieren ihre" ist ebenso chaotisch. Der einzige Weg, wie ich es herausfinden kann, ist:

git show test-branch:Makefile > Makefile; git add Makefile;

Dies gibt mir auch eine vermischte Commit-Nachricht, die Conflicts: Makefile zweimal enthält.

Kann jemand bitte darauf hinweisen, wie man die beiden oben genannten Aktionen auf einfachere Weise durchführt? Vielen Dank




Basierend auf der Antwort von Kynan, sind hier die gleichen Aliase, modifiziert, so dass sie Leerzeichen und erste Bindestriche in Dateinamen behandeln können:

accept-ours = "!f() { [ -z \"$@\" ] && set - '.'; git checkout --ours -- \"$@\"; git add -u -- \"$@\"; }; f"
accept-theirs = "!f() { [ -z \"$@\" ] && set - '.'; git checkout --theirs -- \"$@\"; git add -u -- \"$@\"; }; f"



Links