Git: Wie bewegen sich hin und her zwischen Commits
Frage
Ich habe eine newbie Frage zu Git:
Ich brauche hin und her in einer Geschichte von einem Ast zu bewegen. Das heißt, ich brauche sie in in einer alten Revision waren alle die Dateien in den Zustand zu versetzen, und dann muß ich im Repository auf den neuesten Stand kommen. Ich brauche nicht zu begehen.
Mit SVN, es wäre
svn up -r800
zu erhalten, Revision 800 und
svn up
synchron mit dem Repository zu erhalten.
Ich kenne den Hash-Wert des commit Ich möchte zurück zu bekommen, so dass ich versuchte,
git reset <hash>
, die mir scheint, es zu bekommen. Aber dann habe ich versucht,
git pull
aber beschwert sich über Konflikte.
Also, was ist der richtige Weg durch die Geschichte der Branche zu bewegen?
Ich bin in Bezug auf den SVN denke, hezitate also nicht, mich zu einem paar netten Tutorial zu zeigen. Beachten Sie, dass ich schon geprüft http://git.or.cz/course/svn.html und http://www.youtube.com/watch?v=8dhZ9BXQgc4 .
Danke, Ondra.
Lösung
Nun, ich bin ein ehemaliger SVN-Benutzer auch, und jetzt git für alle meine Projekte verwenden.
Wenn git verwenden, sollten Sie die Art und Weise von der Client-Server-Architektur des Denkens, die in svn verwendet wird. In SVN muss jede Änderung eine Verbindung mit dem Server. Mit git, ist Ihr Repo im Arbeitsverzeichnis. Sie haben nicht eine Verbindung für jede Repo-Aktion müssen.
Verwenden Sie nur git push
und git pull
mit Repo zu synchronisieren. Denken Sie daran, rsync oder eine Backup-Lösung wie verwenden, um zwei Platz genau denselben Inhalt haben lassen. Genau wie Sie externe Backup-Festplatte anschließen, dann stellen Sie den Inhalt in es mit dem Inhalt in der Haupt gleich. Das ist die Nutzung von git pull
und git push
.
Wenn Sie nur hin und her, die Geschichte gehen wollen, macht das, indem es git checkout
. Siehe die Revision-ID mit git history
. Wenn Sie Linux verwenden, zu verwenden gitk
den Revisionsbaum zu sehen. In Windows Tortoisegit kann es angezeigt Revisionsgraphen verwenden.
Um auf die neueste Version, die Verwendung git checkout master
zurück. Vor jedem Befehl tun, immer machen sich git status
tun. Dieser Befehl wird alles, was Sie über die aktuellen Repo-Zustand wissen müssen angezeigt werden, und welche Maßnahmen, dass Sie es richtig tun müssen, machen. Vor git pull
und git push
tun, es besser ist, sicher zu stellen, dass git status
Ergebnis Text working directory clean
enthalten.
Wenn Sie eine Datei, um es der vorherigen Revision wiederherstellen müssen, können Sie es mit git merge
tun. Bevor es zu einer Datei zu tun, testen Sie es zuerst mit git diff
. Ex: git diff rev1:rev2 filename
. Es wird anders zwischen zwei Revisions ausdrucken. Änderung rev1 wird durch die Änderungen in rev2 ersetzt werden. So revert zu tun, wird rev2 sein die älter als rev1. Nachdem Sie mit dem diff Ergebnis zufrieden stellen, tun Sie es mit git merge
, ersetzen Sie einfach diff
mit merge
, bleiben alle anderen Parameter gleich.
Ich hoffe, das Ihnen hilft. Der Hauptschlüssel ist zu sehen, dass Ihr Arbeitsverzeichnis Ihre Repo ist. Dieses Verständnis wird Ihnen es die volle Leistungsfähigkeit helfen verwenden git. Viel Glück.
Andere Tipps
Sie kann git checkout
verwenden Sie verpflichten zur Kasse und dann verwenden, mit einem Zweignamen zu einem benannten Zweig zurück zu gehen.
git checkout
mit einem Commit-ID und nicht ein Zweigname bewegen Sie aus beliebigen Namen Zweig und zu dem, was als freistehendem Kopf bekannt ist .
Wenn Sie git reset
verwenden, dann wird es Ihre Branche bewegt sich zurück zu einem alten Zustand, die neueren Commits verwaist was wahrscheinlich ist, nicht das, was Sie wollen.
Die anderen Antworten sind informativ, aber ich glaube, das ist am nächsten, was die OP will:
Fügen Sie diese beiden Funktionen zu Ihrer ~ / .bashrc:
# checkout prev (older) revision
git_prev() {
git checkout HEAD~
}
# checkout next (newer) commit
git_next() {
BRANCH=`git show-ref | grep $(git show-ref -s -- HEAD) | sed 's|.*/\(.*\)|\1|' | grep -v HEAD | sort | uniq`
HASH=`git rev-parse $BRANCH`
PREV=`git rev-list --topo-order HEAD..$HASH | tail -1`
git checkout $PREV
}
Verbrauch:
$ git_prev
Previous HEAD position was 7042c8a... Commit message2
HEAD is now at d753ecc... Commit message1
$ git_next
Previous HEAD position was d753ecc... Commit message1
HEAD is now at 7042c8a... Commit message2
Hinweis : Diese Befehle geben immer HEAD Zustand abgelöst. Wenn Sie git_prev
dann git_next
aus einem aktuell ausgecheckt Zweig, werden Sie wieder auf die neueste Version am Ende, aber Sie werden in frei stehende HEAD Zustand sein. Hat git checkout BRANCH_NAME
, um wieder normal.
Versuchen git reflog
, diese Listen Commits und Auscheckvorgänge Sie wechseln zwischen den Commits getan haben, auch die Commits Sie verloren haben, wenn der Kasse zu einem früheren begehen.
Dann können Sie versuchen, git checkout <hash of a commit>
zu wechseln Sie zu dieser begehen.
Hope, das hilft!
Wenn Sie eine andere Version einer Datei Kasse, Verwendung
git checkout rev -- filename
Wo rev die ID eines verpflichten kann, der Name eines Zweiges, der Name eines Tags oder eine relative Version.
Mit git log
, gitk
aussehen Versionen zu prüfen, um zu sehen, welche Version der Datei, die Sie wollen.
Um diese Version der Datei dauerhaft zu machen, müssen Sie die Datei begehen: git add filename; git commit filename
Ich würde nicht empfehlen git pull
Versionen zu untersuchen, weil es eine Zusammenführung tut -. Möglicherweise Ihren aktuellen Status Ändern
Sie brauchen nicht zu verwenden git reset
in diesem Fall, wenn Sie eine Datei git add
entscheiden Sie, nicht zu begehen.