Будет ли выборка / слияние не работать, если файлы добавлены или удалены в репозитории GitHub?
Я сделал два изменения в моем remote repository
в GitHub
, добавив новый file
и удаление old file
(используя веб-интерфейс GitHub
). когда я делаю:
git fetch origin master
remote: Counting objects: 6, done.
remote: Compressing objects: 100% (4/4), done.
remote: Total 5 (delta 2), reused 0 (delta 0)
Unpacking objects: 100% (5/5), done.
From github.com:TommyHilly/programFiles
* branch master -> FETCH_HEAD
git merge origin/master
Already up-to-date.
всякий раз, когда новые файлы добавляются или удаляются, git pull
только работает (git fetch/merge fails
).
$git pull
From github.com:TommyHilly/programFiles
b598c97..531d466 master -> origin/master
Updating b598c97..531d466
Fast-forward
README.txt | 2 ++
a.out | Bin 8496 -> 0 bytes
2 files changed, 2 insertions(+)
create mode 100644 README.txt
delete mode 100755 a.out
Но когда я отредактировал некоторые файлы (ничего нового не было добавлено или удалено), git fetch
а также merge
работает отлично.
Я делаю что-то не так или это как git
работает?
РЕДАКТИРОВАТЬ:
git remote -v
origin git@github.com:TommyHilly/programFiles.git (fetch)
origin git@github.com:TommyHilly/programFiles.git (push)
РЕДАКТИРОВАТЬ 2: просто делать git fetch
а также git merge origin/master
похоже на работу. Но я не понимаю, что происходит?
Но git fetch origin master
с последующим git merge origin/master
не работал?
1 ответ
Это правда, что git pull
действительно просто git fetch
плюс git merge
, Но есть куча предостережений.
мерзкий выбор
Когда вы бежите:
$ git fetch origin master
это означает":
$ git fetch origin master:FETCH_HEAD
который говорит git fetch
переехать к origin
и спросите их - в данном случае github, и я буду использовать "они" и "они" здесь для обозначения origin
, так что "это" означает "ваш выбор" - что они имеют для ответвления master
, Что бы они ни имели, это приносит, но это ставит это под местное специальное название FETCH_HEAD
,
Если вы запустите вместо:
$ git fetch origin
это "средство" для fetch
переехать к origin
и спросите их обо всех их ветвях и приведите их всех как "отдаленные ветви". Если у них есть ветки "master" и "эксперимент", он переносит их как "удаленные ветки" origin/master
а также origin/experiment
,
мерзавец слияния
Первый, git merge
всегда сливается с вашей текущей веткой (помеченной *
в git branch
выход). 1 Другими словами, он знает, куда слить. Вы должны сказать ему, откуда слиться, хотя.
Если вы запускаете:
$ git merge
без аргументов, он должен выяснить, с какого коммит-идентификатора вы хотите "объединить". Это делается путем поиска переменной конфигурации, merge.defaultToUpstream
, Если вы получаете:
fatal: No commit specified and merge.defaultToUpstream not set.
это означает merge.defaultToUpstream
не установлен или установлен на false
вместо true
,
Если вы бежите git merge name-or-ID
, что говорит git merge, что "слить", поэтому ему не нужна эта специальная переменная конфигурации. Следовательно:
$ git merge FETCH_HEAD
означает "найти коммит, указанный FETCH_HEAD
". Или, если вы запустите:
$ git merge origin/master
это означает "найти коммит, указанный origin/master
".
Важно: если вы предоставите более одного дополнительного аргумента git merge
, это делает "слияние осьминога" (который я не собираюсь описывать в этом ответе). Это означает, что git merge origin master
сильно отличается от git merge origin/master
, Косая черта имеет огромное значение, потому что она меняет merge
команда от слияния с двумя аргументами до слияния с одним аргументом. (Я думаю, что это неудачно - и / или плохой дизайн - что git pull
Вы используете именно эти аргументы, но они имеют в виду нечто совсем иное git merge
.)
Положить их вместе
Итак, когда вы хотите поставить FETCH_HEAD
в git merge
и когда вы хотите поставить origin/master
вместо? Ну, вернитесь и перечитайте раздел о git fetch выше.
FETCH_HEAD
метод старый 2 способ, которым вы говорите git fetch
и место для выборки, и ветвь для выборки, и есть git fetch
напишите результат под специальным именем FETCH_HEAD
, Неважно, какую ветку вы выбрали: git fetch origin inigo_montoya
, git fetch origin you_killed_my_father
, git fetch origin inconceivable
: они все приходят и переименовываются FETCH_HEAD
так вот с чем вы сливаетесь.
origin/master
метод новый 3 способа: вы бежите git fetch origin
и это просто приносит все, и вы можете не торопиться и просматривать "удаленные ветви" на досуге. Как только вы довольны origin/master
и готовы объединить его, вы объединяете его по его (ясному, простому и очевидному) имени, а не по FETCH_HEAD
,
мерзавец
Увы, git pull
, 4 pull
Скрипт по-прежнему использует "старый способ". Когда ты бежишь git pull origin master
или даже просто git pull
без аргументов, 5 заводится git fetch origin master
, что делает git fetch
вести себя "по-старому". Тогда он использует git merge FETCH_HEAD
, что он должен, потому что это просто запустить git fetch
такой, что fetch не обновлялся origin/master
, 6
1 Даже если вы находитесь в режиме "отсоединенная ГОЛОВА", git merge
все еще сливается с вашей "текущей веткой", вроде. Просто самая близкая вещь к "текущей ветке" теперь это "отделенная ГОЛОВА".
2 Или, может быть, "традиционный". Я хотел бы, чтобы это было "устаревшим", и это могло бы произойти в конечном счете, но пока это довольно глубоко укоренилось.
3 И намного выше.:-)
4 мне не нравится git pull
, Он предназначен для удобства, и из-за его настойчивости в выполнении "старого способа" он оказывается менее удобным, не говоря уже об одной редкой, но серьезной ошибке, которая была у него долгое время (исправлено в git 1.8.4).
5 Без аргументов git pull
получает имя удаленного и ветви из конфигурации для текущей ветви. Если вы на ветке master
например, git читает branch.master.remote
а также branch.master.merge
получить origin
а также master
, Это те же самые значения, которые делают локальную ветвь master
"отслеживающая ветвь", отслеживающая удаленная ветвь origin/master
, Что здорово, кроме git pull
сил git fetch
не обновлять origin/master
, Так git pull
обновляет ваш местный master
, но оставляет такие вещи, что мерзавец говорит вам, что вы сейчас впереди origin/master
! Тьфу. (Это исправлено в git 1.8.4; git fetch
обновляет удаленные ветви сейчас, даже когда пишет в FETCH_HEAD
.)
6 Это исправлено в git 1.9, что в итоге может сделать git pull
удобный метод, который на самом деле удобно.:-)