2013-07-20 23 views
6

In dem git docs (und zahlreichen Threads SO) dieser Reset-Ansatz wird empfohlen:Warum vor git reset rufen git reset --soft explizit (--mixed)

$ git reset --soft HEAD^ ;# go back to WIP state <2> 
$ git reset          <3> 

.2. Dadurch wird der WIP-Commit aus dem Commit-Verlauf entfernt und der Arbeitsbaum in den Zustand versetzt, unmittelbar bevor Sie diesen Snapshot erstellt haben.

.3. Zu diesem Zeitpunkt enthält die Indexdatei noch alle WIP-Änderungen, die Sie als Snapshot-WIP festgelegt haben. Dadurch wird der Index aktualisiert, sodass Ihre WIP-Dateien als nicht festgeschrieben angezeigt werden.

https://www.kernel.org/pub/software/scm/git/docs/git-reset.html

Offensichtlich das ist in Ordnung, aber es scheint, dass diese beiden Befehle von

$ git reset HEAD^ 

(was äquivalent ist) ersetzt werden könnte

$ git reset --mixed HEAD^ 

die beide zurückgesetzt sollten der HEAD-Zeiger und der Index zum vorherigen Commit. Gibt es tatsächlich einen Unterschied zwischen dem Ergebnis dieses Befehls und den vorherigen beiden? Wenn nicht, gibt es einen Grund, den zweistufigen Prozess zu bevorzugen? Oder wurde es in den Dokumenten einfach so gemacht, um das Verhalten von --soft explizit zu veranschaulichen?

Antwort

5

Nein, es scheint keinen Unterschied zu geben.
Es ist mehr, um die git reset --soft (d. H.nur bewegenden Kopf, der kann have other more practical uses)

git reset HEAD ist für „unstaging“, und eine einfache git reset HEAD^ nicht beide (den Kopf bewegen und unstage, keine Notwendigkeit für --mixed, da es die Standardoption ist)


Hier ist ein kurzer Test, um zu sehen, wie das aussieht:

Vor (Sie gerade zurück zu Funktion zu wechseln, in dem Sie ein „wip“ begangen - work in progress):

C:\Users\VonC\prog\git\test\r\r3>gl 
* 6ac95bd - (origin/master, origin/HEAD, master) fix in master (2 minutes ago) <VonC> 
| * fd8d97d - (HEAD, origin/feature, feature) snap WIP (3 minutes ago) <VonC> 
| * 16066dd - f1 (3 minutes ago) <VonC> 
|/ 
* e8ad96f - f1 (3 minutes ago) <VonC> 

Der Reset selbst:

C:\Users\VonC\prog\git\test\r\r3>git reset "HEAD^" 
Unstaged changes after reset: 
M  f 

dass Sie den Status gibt:

C:\Users\VonC\prog\git\test\r\r3>git st 
# On branch feature 
# Your branch is behind 'origin/feature' by 1 commit, and can be fast-forwarded. 
# (use "git pull" to update your local branch) 
# 
# Changes not staged for commit: 
# (use "git add <file>..." to update what will be committed) 
# (use "git checkout -- <file>..." to discard changes in working directory) 
# 
#  modified: f 
# 
no changes added to commit (use "git add" and/or "git commit -a") 

Protokoll nach git reset HEAD^

C:\Users\VonC\prog\git\test\r\r3>gl 
* 6ac95bd - (origin/master, origin/HEAD, master) fix in master (6 minutes ago) <VonC> 
| * fd8d97d - (origin/feature) snap WIP (7 minutes ago) <VonC> 
| * 16066dd - (HEAD, feature) f1 (7 minutes ago) <VonC> 
|/ 
* e8ad96f - f1 (8 minutes ago) <VonC> 

In zwei Schritten, hätten Sie gesehen, die folgendes Protokoll nach dem git reset --soft HEAD^:

C:\Users\VonC\prog\git\test\r\r2>gl 
* 6ac95bd - (origin/master, origin/HEAD, master) fix in master (65 seconds ago) <VonC> 
| * fd8d97d - (origin/feature) snap WIP (89 seconds ago) <VonC> 
| * 16066dd - (HEAD, feature) f1 (2 minutes ago) <VonC> 
|/ 
* e8ad96f - f1 (2 minutes ago) <VonC> 

Sie Index würde immer noch überlegen, was für wip inszeniert wurde:

C:\Users\VonC\prog\git\test\r\r2>git st 
# On branch feature 
# Your branch is behind 'origin/feature' by 1 commit, and can be fast-forwarded. 
# (use "git pull" to update your local branch) 
# 
# Changes to be committed: 
# (use "git reset HEAD <file>..." to unstage) 
# 
#  modified: f 
# 

Der Reset würde dann unstaged, Sie wieder auf die gleiche Stufe zu bringen als ein git reset HEAD^ in einem Schritt haben würde:

C:\Users\VonC\prog\git\test\r\r2>git reset 
Unstaged changes after reset: 
M  f 

C:\Users\VonC\prog\git\test\r\r2>git st 
# On branch feature 
# Your branch is behind 'origin/feature' by 1 commit, and can be fast-forwarded. 
# (use "git pull" to update your local branch) 
# 
# Changes not staged for commit: 
# (use "git add <file>..." to update what will be committed) 
# (use "git checkout -- <file>..." to discard changes in working directory) 
# 
#  modified: f 
# 
no changes added to commit (use "git add" and/or "git commit -a") 
+0

Danke für die Bestätigung. Und sicherlich gibt es andere Anwendungen für git reset --soft. (Im einfachsten Fall gibt es oft auch keinen Grund, den Index zurückzusetzen. In diesem Fall erspart Soft Ihnen die Notwendigkeit, die Dateien neu zu staffeln.) Aber es ist gut zu wissen, dass die beiden nicht notwendig sind -Stage-Prozess, wenn Sie den Index ebenfalls zurücksetzen möchten. Warum sollten Sie mehr Zeichen eingeben als nötig? –

+0

@NathanStretch Ich stimme zu. Es ist mehr eine Wahl zu geben (für den Fall, dass Sie eine laufende Arbeit, bestehend aus Evolutionen, die inszeniert werden sollten, und * anderen * Evolutionen, die separat aufgeführt werden sollen *, geben: dann werden Sie alles auflösen und "git add" was Sie tun möchte dich zuerst in deinem wip verpflichten. – VonC

Verwandte Themen