Ich habe einen repo1
und repo2
auf einem lokalen Computer. Sie sind sehr ähnlich, aber letzteres ist eine Art anderer Zweig ( repo1
wird nicht mehr gepflegt).
/path/to/repo1 $ git log HEAD~5..HEAD~4
<some_sha> Add: Introduce feature X
Wie Änderungen verpflichten beantragen <some_sha>
in repo1
zu repo2
?
Muss ich einen Patch vorbereiten oder ist es möglich, einen cherry-pick
zwischen den Repos zu machen?
Wie wäre es, dasselbe zu tun, aber für eine Reihe von Commits?
Antworten:
Als Hack können Sie versuchen, das Rezept für den Vergleich von Commits in zwei verschiedenen Repositorys auf der GitTips-Seite zu ändern , z.
Wo
../repo
ist der Pfad zum anderen Repository?Mit modernem Git können Sie mit Cherry-Pick mehrere Revisionen und Revisionsbereiche verwenden .
Das
$(git --git-dir=../repo/.git rev-parse --verify <commit>)
ist hier, um<commit>
(zum BeispielHEAD
oderv0.2
, odermaster~2
, was Werte im zweiten Repository sind, aus dem Sie kopieren) in die SHA-1-ID des Commits zu übersetzen. Wenn Sie SHA-1 einer Änderung kennen, die Sie auswählen möchten, ist dies nicht erforderlich.Beachten Sie jedoch, dass Git das Kopieren von Objekten aus dem Quell-Repository überspringen kann, da es nicht weiß, dass das alternative Objekt-Repository für einen Vorgang nur vorübergehend ist. Möglicherweise müssen Sie Objekte aus dem zweiten Repository kopieren mit:
Dadurch werden die aus dem zweiten Repository ausgeliehenen Objekte in den ursprünglichen Repository-Speicher verschoben
Nicht getestet.
Eine nicht so hackige Lösung ist es, der knittl Antwort zu folgen :
git format-patch
git am --3way
diese Option , um Patches anzuwendenquelle
fatal: unable to read tree ...
aber nachdemgit reset HEAD^
alles gut funktioniert<commit>
aber derrev-parse --verify
Befehl mag es nicht, da er nur einzelne Festschreibungswerte akzeptiert. Da jedochcherry-pick
sowohl Einzel- als auch Bereichs-Commit-Werte akzeptiert werden, frage ich: Warum wird diesrev-parse
benötigt?git rev-parse
benötigt, wenn Sie ein beziehen möchten begehen , indem er seine ref-basierten Namen in anderen Repository, zum Beispielmaster
,HEAD^^
oder so ähnlich; rev-parse verwandelt es in eine universelle SHA-1-Kennung.Sie möchten diesen Patch wahrscheinlich verwenden
git format-patch
und danngit am
auf Ihr Repository anwenden.Oder in einer Zeile:
quelle
GIT_ALTERNATE_OBJECT_DIRECTORIES
(diese würde mein Repository beschädigen).--ignore-whitespace
zumgit am
Befehl kann Konflikte lösen und vermeiden, dass eine 3-Wege-Zusammenführung durchgeführt werden mussSie können dies tun,
cherry-pick
wenn Sie das zweite Repo als Fernbedienung zum ersten (und dannfetch
) hinzufügen .quelle
git fetch [remote-name]
im zweiten Repo und danngit cherry-pick [sha1]
.cherry-pick
. Auch wenn es sich wie der "richtige" Weg anfühlt, ist es nicht immer der praktischste.Ich habe ein kleines Skript zum Anwenden der Diff-Ausgabe von Repo Diff https://github.com/raghakh/android-dev-scripts/commit/a57dcba727d271bf2116f981392b0dcbb22734d0 geschrieben
quelle