Voglio trovare tutti i commit di unione che riguardano o riguardano un determinato file.L'unione di merge si ripercuote su un file
Per lo sfondo, qualcuno ha risolto male un conflitto durante l'unione e non è stato notato dal team per alcuni giorni. A quel punto, molte altre fusioni non correlate erano state commesse (alcuni di noi preferivano non usare rebase, o le cose sarebbero più semplici). Ho bisogno di localizzare il commit di "cattiva" unione, in modo che possa essere controllato per identificare cos'altro potrebbe essere stato ripristinato (e, ovviamente, per identificare e punire i colpevoli).
Lo scenario è simile a questo:
$ echo First > a.txt && git add a.txt && git commit -m 'First commit'
$ git branch branch1
$ echo "Second: main-branch" >> a.txt && git commit -a -m 'Commit on master'
$ git tag a1
$ echo "Third: main" >> a.txt && git commit -a -m 'Other commit on master'
$ git checkout branch1
$ echo "Second: on branch1" >> a.txt && git commit -a -m 'Commit on branch'
$ git tag b1
... Così ora ci sono modifiche in conflitto a a.txt in master e Branch1.
$ git checkout master
$ git merge branch1
Auto-merging a.txt
CONFLICT (content): Merge conflict in a.txt
Automatic merge failed; fix conflicts and then commit the result.
$ cat a.txt
First
<<<<<<< HEAD:a.txt
Second: main-branch
Third: main
=======
Second: on branch1
>>>>>>> branch1:a.txt
$ vi a.txt
# ...
$ cat a.txt
First
Second: on branch1
$ git add a.txt
$ git commit -m 'Merge commit'
... In altre parole, la risoluzione è "prendere loro". Il grafico ora si presenta così:
$ git log --graph --branches --format='%h %s %d'
* fefb623 Merge commit (refs/heads/master)
|\
| * 93e065e Commit on branch (refs/tags/b1, refs/heads/branch1)
* | cf4d12b Other commit on master
* | 6fade67 Commit on master (refs/tags/a1)
|/
* 07545ea First commit
A questo punto la versione errata di a.txt è sul master. La versione di a1 è ciò che vogliamo, ma è stata commessa la versione b1. Finora ho provato:
$ git log --decorate --oneline a.txt
93e065e (refs/tags/b1, refs/heads/branch1) Commit on branch
07545ea First commit
Ok, quindi non vengono visualizzati né a1 né il commit di unione.
$ git log --decorate --oneline --follow a.txt
...
Questo mi mostra tutto su entrambi i rami, ma continua a non commettere l'unione.
$ git log --oneline --graph --decorate a1..master
...
Questo è, naturalmente, "tutto in master non in A1", che opera in questo esempio giocattolo, ma nel mio caso reale mi dà tutte le unioni fatto di recente (e nessuna indicazione di cui uno ha toccato a.txt) .
Riesco a razionalizzare la scomparsa di a1 dalla cronologia del file, poiché l'unione ha scelto di omettere quel cambiamento (almeno nel senso in cui si preoccupa, penso). Ma come faccio a localizzare tutti i commit di unione che riguardano a.txt? È possibile anche senza l'ispezione manuale di tutte le fusioni di unione di candite?
Il commettere registro non mostrano fonde perché diff con il primo genitore commit, che è nel ramo si Unite da; quindi git ritiene che nessun file sia stato modificato – CharlesB