2010-01-17 11 views
24

Ich bin neu in Git, aber vertraut mit SVN. Als Test habe ich ein Repository in einem lokalen Verzeichnis mit git init erstellt. Dann habe ich das leere Repository (über SSH mit 127.0.0.1, was ich noch testen wollte) in ein anderes lokales Verzeichnis geklont. Ich habe einige Dateien in Repository 2 hinzugefügt, ich habe git add * und schließlich git commit -a -m "First source code".Wie funktionieren Patches in Git?

Ich möchte jetzt einen Patch mit git format-patch erstellen und auf Repository 1 anwenden. Wie mache ich das? Ich weiß, dass es ein Handbuch gibt, aber diese Dinge sind furchtbar kompliziert und lassen mich bestimmte Dinge auf meinem Monitor tun.

+2

Sie brauchen Patches nicht so oft zu verwenden, wenn Sie Git verwenden, überprüfen Sie meine Antwort unter –

+1

[This] (https://ariejan.net/2009/10/26/how-to-create-and-apply-a-patch-with-git/) Artikel könnte hilfreich sein un den kompletten Prozess des Patchens verstehen –

Antwort

19

Ihr Patch erstellen über:

$ git format-patch master --stdout > patch.diff 

dann patch.diff das Diff enthalten, die Sie dann an jemanden senden kann sonst mit anwenden:

$ git am < patch.diff 

Manchmal, wenn die Handbücher sind ein wenig dicht, macht es Sinn, für ein Tutorial zu suchen:

http://luhman.org/blog/2009/09/22/git-patch-tutorial

13

Die einfachste Methode, Patches aus dem letzten commit (oder letzten Commits) zu erstellen ist format-patch mit einer negativen Zahl zu verwenden, um die Zahl der Commits angeben erstellen Patches für:

git format-patch -1 

Sie erhalten eine Patch-Datei erhalten benannt nach der Commit-Beschreibung.Die Verwendung am, um es in ein anderes Repository einfügen:

git am << name_of_patch_file 
+2

Nur ein Nitpick; aber es ist keine negative Zahl, es ist nur eine Flagge, um die Tiefe anzuzeigen. Keine komischen Magics! Sie können auch einen Bereich von Commits angeben, wenn dies natürlicher ist, z. 'git format-patch ursprung/master..' oder so weiter (siehe git rev-parse Handbuch für alle Möglichkeiten, diese Argumente auszudrücken). –

+0

Unter Windows benutzen 'git am Name_of_patch_file' –

0

Sie haben auf „2-Repository“ zu gehen, die, die Sie von den Patch erstellen möchten, und führen Sie git-format-patch den Patch zu erstellen: git format-patch Master --stdout> name_of_patch_file

Dann gehen Sie in "Repository 1", die, die Sie den Patch anwenden möchten: git apply name_of_patch_file

Manchmal ist es sinnvoll, nur zu prüfen, ob die Patch wird Probleme verursachen: git apply --check name _of_patch_file

2

GitHub Mit Patch

  1. .patch zu einem commit URL Fügen Sie die Patch-Datei, zB

    github.com/git/git/commit/b6b3b6a.patch

  2. Patch, um die ursprüngliche Datei wie folgt zu erhalten:

    git am /tmp/b6b3b6a.patch 
    

Mit GitHub diff

  1. .diff zu einem commit URL Fügen Sie die Patch-Datei, zB

    github.com/git/git/commit/b6b3b6a.diff

  2. Patch, um die ursprüngliche Datei wie folgt zu erhalten:

    git apply -p0 /tmp/b6b3b6a.diff 
    

§5.3 Distributed Git - Maintaining a Project

+0

Schön mit einem Beispiel, aber der Link funktioniert leider nicht mehr. :( –

2

Die richtige und einfacher Weg, dies zu tun, wenn Sie mit Git sind ist über Fernbedienungen:

cd \path\to\repo1 
git remote add otherrepo \path\to\repo2 
git fetch otherrepo 

git log otherrepo/master ## Find the commit you want to steal in the list 

git cherry-pick SOME_SHA1 ## Snag just one commit 
git merge otherrepo/master ## Merge all of the new commits from otherrepo/master 

Dies wird wandern von einem Repo zum anderen verpflichtet, ihre Autoren einschließlich und Commit-Nachrichten, und hilft Ihnen Konflikte zu lösen (besonders wenn Sie> 1 commit)

+0

Wird dies funktionieren, wenn seine ursprüngliche Repo nicht das gleiche ist? Alle Commits werden unterschiedliche Hashes haben, da es unterschiedliche Geschichte hat. Ist das Patchen nicht die einzige Möglichkeit, es dann zu tun? –

Verwandte Themen