Как разбить один файл на произвольную версию в Git?

Как я могу отличить файл, скажем pom.xml, от главной ветки до произвольной более старой версии в Git?

Ответ 1

Вы можете сделать:

git diff master~20:pom.xml pom.xml

... сравнить текущий pom.xml с тем, который был от master 20 версий назад через первого родителя. Вы можете заменить master~20, конечно, с именем объекта (SHA1sum) коммита или любым из многими другими способами указания версии..

Обратите внимание, что это фактически сравнивает старый pom.xml с версией в рабочем дереве, а не с версией, заключенной в master. Если вы этого хотите, тогда вы можете сделать следующее:

git diff master~20:pom.xml master:pom.xml

Ответ 2

git diff <revision> <path>

Например:

git diff b0d14a4 foobar.txt

Ответ 3

Если вы хотите увидеть разницу между последней фиксацией одного файла, вы можете сделать:

git log -p -1 filename

Это даст вам diff файла в git, не сравнивает ваш локальный файл.

Ответ 4

Чтобы узнать, что было изменено в файле в последнем коммите:

git diff HEAD~1 path/to/file.

Вы можете изменить число (~ 1) на n-ю фиксацию, которую вы хотите разграничить.

Ответ 5

git diff -w HEAD origin/master path/to/file

Ответ 6

Если ни одна из них не является вашим HEAD, тогда bash расширение брекета окажется действительно полезным, особенно если ваши имена файлов длинны, пример выше:

git diff master~20:pom.xml master:pom.xml

Стал бы

git diff {master~20,master}:pom.xml

Подробнее о Расширение брекета с помощью bash.

Ответ 7

Общий синтаксис:

$git diff oldCommit..newCommit -- **FileName.xml > ~/diff.txt

для всех файлов с именем "FileName.xml" в любом месте вашего репо.

Обратите внимание на пробел между "-" и "**"

Ответьте на вопрос:

$git checkout master
$git diff oldCommit..HEAD -- **pom.xml 
or
$git diff oldCommit..HEAD -- relative/path/to/pom.xml 

как всегда с git, вы можете использовать тег /sha 1/ "HEAD ^" для id commit.

Протестировано с помощью git 1.9.1 на Ubuntu.

Ответ 9

Для сравнения с 5 фиксацией текущей, как на master, просто выполните:

git diff master~5:pom.xml master:pom.xml

Также вы можете ссылаться на хеш-номер фиксации, например, если хэш-номер x110bd64, вы можете сделать что-то подобное, чтобы увидеть разницу:

git diff x110bd64 pom.xml

Ответ 10

Если вам нужно разделить один файл в тире, например, вы можете сделать

git diff [email protected]{0} -- path/to/file

Ответ 11

Если вы ищете diff для определенного коммита и хотите использовать пользовательский интерфейс github вместо командной строки (скажем, вы хотите связать его с другими людьми), вы можете сделать:

https://github.com/<org>/<repo>/commit/<commit-sha>/<path-to-file>

Например:

https://github.com/grails/grails-core/commit/02942c5b4d832b856fbc04c186f1d02416895a7e/grails-test-suite-uber/build.gradle

Обратите внимание на предыдущие и следующие ссылки в правом верхнем углу, которые позволяют вам перемещаться по всем файлам в фиксации.

Это работает только для конкретной фиксации, но не для сравнения любых двух произвольных версий.

Ответ 12

git diff master~20 -- pom.xml

Работает, если вы тоже не находитесь в мастер-ветке.