Як ви отримуєте git, щоб завжди тягнути з певної гілки?


485

Я не майстер git, але працюю з цим вже деякий час, з кількома різними проектами. У кожному проекті я завжди git clone [repository]і з того моменту завжди git pull, доки, звичайно, не маю видатних змін.

Нещодавно мені довелося повернутися до попереднього відділення, і це робилося з git checkout 4f82a29. Коли я знову був готовий тягнути, я виявив, що мені доведеться повернути свою гілку до майстра. Тепер я не можу тягнути за допомогою прямого, git pullа натомість повинен вказати git pull origin master, що дратує, і вказує мені, що я не повністю розумію, що відбувається.

Що змінилося, що не дозволяє мені робити пряму, git pullне вказуючи початкового майстра, і як це змінити назад?

ОНОВЛЕННЯ:

-bash-3.1$ cat config
[core]
    repositoryformatversion = 0
    filemode = true
    bare = false
    logallrefupdates = true
[branch "master"]
[remote "origin"]
    url = git@github.com:user/project.git
    fetch = refs/heads/*:refs/remotes/origin/*

ОНОВЛЕННЯ 2: Щоб було зрозуміло, я розумію, що мій оригінальний метод, можливо, був неправильним, але мені потрібно виправити це репо, щоб я міг просто використовувати git pullзнову. В даний час git pull призводить до:

-bash-3.1$ git pull
You asked me to pull without telling me which branch you
want to merge with, and 'branch.master.merge' in
your configuration file does not tell me either.  Please
name which branch you want to merge on the command line and
try again (e.g. 'git pull  ').
See git-pull(1) for details on the refspec.

If you often merge with the same branch, you may want to
configure the following variables in your configuration
file:

    branch.master.remote = 
    branch.master.merge = 
    remote..url = 
    remote..fetch = 

See git-config(1) for details.

Я можу сказати, git pullяку гілку об’єднати, і вона працює правильно, але git pullне працює, як це було раніше, ніж моя git checkout.


Як виглядає ваш .git / config? Що ви зробили після того, як ви перевірили це зобов’язання?
Райан Грем

Ви робили комунікації поверх 4f82a29?
Пат Ноц

Пат, я не робив ніяких зобов’язань поверх цього. Це на сервері, і нам потрібно було повернутись до стабільної версії, щоб приховати створену нами помилку. Ця система не призначена для розробки, тому я просто хотів відкотитись, почекати, поки ми виправимо помилку, а потім повернемося до головної версії.
Девід Сміт

2
Райан, я оновив, щоб включити .git / config. Після каси я нічого не робив. Цей комп'ютер - це сервер, не для розробки.
Девід Сміт

Відповіді:


730

У розділі [branch "master"]Спробуйте додати наступне до файлу конфігурації Git репо ( .git/config):

[branch "master"]
    remote = origin
    merge = refs/heads/master

Це говорить про Git 2 речі:

  1. Коли ви перебуваєте на головній гілці, пульт за замовчуванням - це походження.
  2. Під час використання git pullна головній гілці, не вказана віддалена та гілка, використовуйте пульт за замовчуванням (походження) та об'єднайте зміни у віддаленій головній гілці.

Я не впевнений, чому ця настройка була б видалена з вашої конфігурації. Можливо, вам доведеться дотримуватися пропозицій, які також публікували інші люди, але це може спрацювати (або допомогти принаймні).

Якщо ви не хочете вручну редагувати конфігураційний файл, ви можете скористатися інструментом командного рядка:

$ git config branch.master.remote origin
$ git config branch.master.merge refs/heads/master

2
Це працювало і для мене, я перевірив проект від github. Я запускаю ОС X 10.4
Сем Барнум

Дуже дякую - це сталося зі мною в одному проекті розробника з одним сховищем "сервер" та двома комп'ютерами (які я часто натискав / тягнув без проблем перед проблемою), не знаю чому, але виправлення спрацювало чудово!
честербр

1
Що ви маєте на увазі під [відділення "майстер"]
ianj

3
@ianj: у файлі конфігурації Git (з кореня repo, .git/config).
mipadi

1
@ianj: З командного рядка ви завжди можете робити $ git config branch.master.remote origin ; git config branch.master.merge refs/heads/masterзамість цього.
mipadi

139

Якщо вам зручніше, ви можете встановити ці параметри через командний рядок (замість редагування файлу конфігурації) таким чином:

  $ git config branch.master.remote origin
  $ git config branch.master.merge refs/heads/master

Або якщо ви схожі на мене, і хочете, щоб це було за замовчуванням у всіх ваших проектах, включаючи ті, над якими ви можете працювати в майбутньому, тоді додайте його як глобальну настройку конфігурації:

  $ git config --global branch.master.remote origin
  $ git config --global branch.master.merge refs/heads/master

12
+1 за знання чарівного слова "refs / heads / master". У мене не було ніяких проблем з'ясувати , як встановити змінну, але не було абсолютно ніякого поняття , що , щоб встановити його на , і людина сторінок не дуже допоможе. Зрештою, я знайшов потрібне місце в документах після того, як знайшов цю відповідь. Для допитливих: магічне слово посилається на шлях до файлу, .gitв якому git з'являється для збереження хеш-коду masterпоточної фіксації.
mokus

84
git branch --set-upstream master origin/master

Це додасть таку інформацію до вашого configфайлу:

[branch "master"]
    remote = origin
    merge = refs/heads/master

Якщо у вас є, branch.autosetuprebase = alwaysвін також додасть:

    rebase = true

1
Я вважаю це найпростішим способом змусити git поводитись так, як запитують, особливо якщо є більше гілок, а не лише віддалених (навіть якщо це потрібно робити для кожної гілки, це один раз на кожну гілку)
s3v3n

2
Я просто спробував це, і я отримую помилку, fatal: Not a valid object name: 'origin/master'.хоча originвін є дійсним дистанційним і masterіснує, як зазвичай, в обох репостах.
Кен Вільямс

2
Кен, для отримання назв віддалених гілок спочатку потрібно зробити "git fetch origin".
Ерік Лі

14
Новіший git хоче, щоб ви використовували git branch --set-upstream-to=origin/master master.
orbeckst

52

Мені важко запам’ятати точні git configабо git branchаргументи, як у відповідях mipadi та Кейсі, тому я використовую ці 2 команди, щоб додати посилання вгору:

git pull origin master
git push -u origin master

Це додасть ту саму інформацію до вашого .git / config, але мені легше запам'ятати.


1
Я згоден. Це має бути найкращою найпростішою відповіддю.
linbianxiaocao

2
Ваша відповідь повинна містити, чому вона працює, і звертайтеся до розділу в документах, який пояснює, чому.
vfclists

24

Git pull поєднує дві дії - отримання нових комісій із віддаленого сховища у відстежуваних гілках, а потім об'єднання їх у поточну гілку .

Коли ви перевірили певну комісію, у вас немає поточної гілки, у вас є лише HEAD, який вказує на останнє зобов’язання, яке ви зробили. Тому git pullне вказані всі його параметри. Ось чому це не спрацювало.

На основі вашої оновленої інформації те, що ви намагаєтеся зробити, це відновити віддалене репо. Якщо ви знаєте команду, яка ввела помилку, найпростіший спосіб впоратися з цим git revertзаписом нової фіксації, яка скасовує вказану помилку :

$ git checkout master
$ git reflog            #to find the SHA1 of buggy commit, say  b12345
$ git revert b12345
$ git pull
$ git push

Оскільки ваш сервер ви хочете змінити, я вважаю, що вам не потрібно переписувати історію, щоб приховати помилку.

Якщо помилка була введена у програмі злиття, ця процедура не працюватиме. Див. Розділ " Як повернути назад" до "несправного" злиття .


Ви даєте мені тут чудову освіту, яку я ціную, але, можливо, я не дуже добре описую свою ситуацію, тож це не є точно відповідним моєму робочому процесу. Я, мабуть, напишу ще одне питання, щоб вирішити це питання. Дякую, Павло! +1 вам, сер.
Девід Сміт

Я просто неправильно прочитав вашу ситуацію. Я радий, що ти отримав потрібну відповідь.
Павло

12

Існує також спосіб налаштування Git таким чином, він завжди тягне та виштовхує еквівалентну віддалену гілку до гілки, яка зараз перевірена, до робочої копії. Це називається гілка відстеження, яка git ready рекомендує встановити за замовчуванням .

Для наступного сховища над поточним робочим каталогом:

git config branch.autosetupmerge true

Для всіх сховищ Git, які не налаштовані інакше:

git config --global branch.autosetupmerge true

Вид магії, ІМХО , але це може допомогти в тих випадках , коли конкретна галузь є завжди поточна гілка .

Коли ви вперше branch.autosetupmergeналаштувались trueта оформили реєстрацію філії, Git повідомить вам про відстеження відповідної віддаленої гілки:

(master)$ git checkout gh-pages
Branch gh-pages set up to track remote branch gh-pages from origin.
Switched to a new branch 'gh-pages'

Потім Git автоматично натисне на відповідну гілку:

(gh-pages)$ git push
Counting objects: 8, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (6/6), done.
Writing objects: 100% (6/6), 1003 bytes, done.
Total 6 (delta 2), reused 0 (delta 0)
To git@github.com:bigben87/webbit.git
   1bf578c..268fb60  gh-pages -> gh-pages

10

Не бажаючи редагувати свій git config файл, я стежив за інформацією в публікації @ mipadi і використовував:

$ git pull origin master

13
Сенс полягав у тому, щоб зробити це автоматично, а не вказувати це.
Ерік

4

На ваше безпосереднє запитання, як змусити його підтягувати господаря, потрібно робити те, що говорить. У конфігурації відділення вкажіть респект, з якого потрібно витягнути.

[branch "master"]
    merge = refs/heads/master

Чи не повинні це бути "refs / heads / master"? Відповідно до git-pull (1), це назва гілки на віддаленому сайті, яка об'єднана за замовчуванням.
Адам Монсен

Так, ви маєте рацію. Репо, з якого я взяв свій приклад, - це особливий випадок. Виправлено.
Райан Грехем

0

Просто хотілося додати трохи інформації, що ми можемо перевірити цю інформацію, git pullавтоматично посилається на якусь галузь чи ні.

Якщо ви запускаєте команду git remote show origin,, (припускаючи походження як коротке ім'я для віддаленого), git показує цю інформацію, чи існує посилання за замовчуванням для цього git pullчи ні.

Нижче наведено зразок випуску. (Взято з документації на git).

$ git remote show origin
* remote origin
  Fetch URL: https://github.com/schacon/ticgit
  Push  URL: https://github.com/schacon/ticgit
  HEAD branch: master
  Remote branches:
    master                               tracked
    dev-branch                           tracked
  Local branch configured for 'git pull':
    master merges with remote master
  Local ref configured for 'git push':
    master pushes to master (up to date)

Зверніть увагу на частину, де це показано, Місцеве відділення, налаштоване на тягнення git.

У цьому випадку git pullбуде посилатися наgit pull origin master

Спочатку, якщо ви клонували сховище, використовуючи git-клон, ці речі автоматично опікуються. Але якщо ви додали віддалений вручну за допомогою git remote add, вони відсутні у конфігурації git. Якщо це так, то частина, де він показує "Місцева гілка, налаштована для 'git pull':", не буде відсутня у висновку git remote show origin.

Наступні кроки, які слід виконати, якщо для них не існує конфігурації git pull, вже були пояснені іншими відповідями.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.