Bagaimana Anda membuat git selalu menarik dari cabang tertentu?

485

Saya bukan master git, tetapi saya telah bekerja dengannya untuk beberapa waktu sekarang, dengan beberapa proyek yang berbeda. Dalam setiap proyek, saya selalu git clone [repository]dan sejak saat itu, selalu bisa git pull, selama saya tidak memiliki perubahan yang luar biasa, tentu saja.

Baru-baru ini, saya harus kembali ke cabang sebelumnya, dan melakukannya dengan git checkout 4f82a29. Ketika saya lagi siap untuk menarik, saya menemukan bahwa saya harus mengatur cabang saya kembali ke master. Sekarang, saya tidak bisa menarik menggunakan straight git pulltetapi sebaliknya, harus menentukan git pull origin master, yang menjengkelkan, dan menunjukkan kepada saya bahwa saya tidak sepenuhnya mengerti apa yang sedang terjadi.

Apa yang telah berubah yang tidak memungkinkan saya untuk melakukan straight git pulltanpa menentukan master asal, dan bagaimana cara mengubahnya kembali?

MEMPERBARUI:

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

UPDATE 2: Agar lebih jelas, saya mengerti bahwa metode asli saya mungkin salah, tetapi saya harus memperbaiki repo ini sehingga saya bisa menggunakannya git pulllagi. Saat ini, git pull menghasilkan:

-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.

Saya dapat memberitahu git pullcabang mana yang akan digabung, dan berfungsi dengan benar, tetapi git pulltidak berfungsi seperti yang dilakukan sebelumnya git checkout.

David Smith
sumber
Seperti apa tampilan .git / config Anda? Apa yang Anda lakukan setelah Anda memeriksa komit itu?
Ryan Graham
Apakah Anda melakukan komitmen di atas 4f82a29?
Pat Notz
Pat, saya tidak melakukan komitmen apa pun di atasnya. Ini ada di server, dan kami harus memutar kembali ke versi stabil untuk menyembunyikan bug yang kami buat. Sistem ini bukan untuk tujuan pengembangan, jadi saya hanya ingin memutar kembali, menunggu sementara kami memperbaiki bug, dan kemudian menarik kembali ke versi kepala.
David Smith
2
Ryan, saya telah memperbarui untuk memasukkan .git / config. Setelah checkout, saya tidak melakukan apa-apa. Komputer ini adalah server, bukan untuk pengembangan.
David Smith

Jawaban:

731

Di bawah [branch "master"], coba tambahkan berikut ini ke file konfigurasi Git repo ( .git/config):

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

Ini memberi tahu Git 2 hal:

  1. Saat Anda berada di cabang master, remote default adalah asal.
  2. Saat menggunakan git pullpada cabang master, tanpa remote dan cabang yang ditentukan, gunakan remote default (asal) dan menggabungkan perubahan dari cabang master jarak jauh.

Saya tidak yakin mengapa pengaturan ini akan dihapus dari konfigurasi Anda. Anda mungkin harus mengikuti saran yang diposkan orang lain juga, tetapi ini mungkin berhasil (atau setidaknya membantu).

Jika Anda tidak ingin mengedit file konfigurasi dengan tangan, Anda dapat menggunakan alat baris perintah sebagai gantinya:

$ git config branch.master.remote origin
$ git config branch.master.merge refs/heads/master
mipadi
sumber
2
Ini bekerja untuk saya juga, saya telah memeriksa proyek dari github. Saya menjalankan OS X 10.4
Sam Barnum
Terima kasih sangat banyak - ini terjadi pada saya pada sebuah proyek pengembang tunggal dengan satu "server" repositori dan dua komputer (yang saya digunakan untuk push / pull sering tanpa masalah sebelum glitch), tidak tahu mengapa, tetapi memperbaiki bekerja baik!
chesterbr
1
Apa yang Anda maksud dengan Under [branch "master"]
ianj
3
@ianj: Di file konfigurasi Git (dari root repo, .git/config).
mipadi
1
@ianj: Dari baris perintah, Anda selalu bisa melakukannya $ git config branch.master.remote origin ; git config branch.master.merge refs/heads/master.
mipadi
139

Jika Anda mau, Anda dapat mengatur opsi-opsi ini melalui baris perintah (alih-alih mengedit file konfigurasi) seperti:

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

Atau, jika Anda seperti saya, dan ingin ini menjadi default di semua proyek Anda, termasuk yang mungkin Anda kerjakan di masa depan, kemudian tambahkan itu sebagai pengaturan konfigurasi global:

  $ git config --global branch.master.remote origin
  $ git config --global branch.master.merge refs/heads/master
Kepala
sumber
12
+1 untuk mengetahui kata ajaib "ref / head / master". Aku tidak kesulitan mencari tahu bagaimana untuk mengatur variabel, tapi benar-benar tidak tahu apa yang harus mengaturnya untuk , dan halaman manual tidak banyak membantu. Saya akhirnya menemukan tempat yang tepat dalam dokumen setelah saya menemukan jawaban ini. Untuk yang penasaran: kata ajaib merujuk ke path file .gitdi mana git muncul untuk menjaga kode hash dari mastercommit saat ini.
mokus
84
git branch --set-upstream master origin/master

Ini akan menambahkan info berikut ke configfile Anda :

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

Jika sudah, branch.autosetuprebase = alwaysmaka itu juga akan menambahkan:

    rebase = true
cmcginty
sumber
1
Saya menemukan ini cara termudah untuk membuat git berperilaku seperti yang diminta, terutama jika ada lebih banyak cabang, tidak hanya jarak jauh (bahkan jika Anda harus melakukan ini untuk setiap cabang, itu satu kali per cabang)
s3v3n
2
Saya baru saja mencoba ini, dan saya mendapatkan kesalahan fatal: Not a valid object name: 'origin/master'.meskipun originmerupakan remote yang valid, dan masterada, seperti biasa, di kedua repo.
Ken Williams
2
Ken, Anda harus melakukan "git fetch origin" terlebih dahulu untuk mendapatkan nama cabang jarak jauh.
Eric Lee
14
Git yang lebih baru ingin Anda gunakan git branch --set-upstream-to=origin/master master.
orbeckst
52

Saya merasa sulit untuk mengingat persis git configatau git branchargumen seperti dalam jawaban mipadi dan Casey, jadi saya menggunakan 2 perintah ini untuk menambahkan referensi upstream:

git pull origin master
git push -u origin master

Ini akan menambahkan info yang sama ke .git / config Anda, tetapi saya merasa lebih mudah diingat.

Luke Sampson
sumber
1
Saya setuju. Ini harus menjadi jawaban terbaik yang paling sederhana.
linbianxiaocao
2
Jawaban Anda harus mencakup mengapa itu bekerja dan merujuk ke bagian dalam dokumen yang menjelaskan mengapa.
vfclists
24

Git pull menggabungkan dua tindakan - mengambil komit baru dari repositori jarak jauh di cabang yang dilacak dan kemudian menggabungkannya ke cabang Anda saat ini .

Ketika Anda memeriksa komit tertentu, Anda tidak memiliki cabang saat ini, Anda hanya memiliki HEAD yang menunjuk ke komit terakhir yang Anda buat. Jadi git pulltidak memiliki semua parameter yang ditentukan. Itu sebabnya itu tidak berhasil.

Berdasarkan info Anda yang diperbarui, apa yang Anda coba lakukan adalah mengembalikan repo jarak jauh Anda. Jika Anda mengetahui komit yang memperkenalkan bug, cara termudah untuk menangani ini adalah dengan git revertmencatat komit baru yang membatalkan komit buggy yang ditentukan:

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

Karena server Anda yang ingin Anda ubah, saya akan berasumsi bahwa Anda tidak perlu menulis ulang riwayat untuk menyembunyikan komit buggy.

Jika bug diperkenalkan di komit gabungan, maka prosedur ini tidak akan berfungsi. Lihat Cara-mengembalikan-gabungan-kesalahan .

Paul
sumber
Anda memberi saya pendidikan yang bagus di sini, yang saya hargai, tetapi saya mungkin tidak menggambarkan situasi saya dengan baik, jadi ini bukan pasangan yang tepat untuk alur kerja saya. Saya mungkin akan mengirim pertanyaan lain untuk mengatasinya. Terima kasih, Paul! +1 untuk Anda, tuan.
David Smith
Saya baru saja salah membaca situasi Anda. Saya senang Anda mendapat jawaban yang Anda butuhkan.
Paul
12

Ada juga cara mengkonfigurasi Git, sehingga selalu menarik dan mendorong cabang jarak jauh yang setara ke cabang yang saat ini diperiksa ke copy pekerjaan. Ini disebut cabang pelacakan yang git ready merekomendasikan pengaturan secara default .

Untuk repositori berikutnya di atas direktori kerja saat ini:

git config branch.autosetupmerge true

Untuk semua repositori Git, yang tidak dikonfigurasi sebaliknya:

git config --global branch.autosetupmerge true

Jenis sihir, IMHO tapi kekuatan ini membantu dalam kasus di mana cabang tertentu adalah selalu cabang saat ini .

Ketika Anda telah branch.autosetupmergemengatur ke truedan checkout cabang untuk pertama kalinya, Git akan memberi tahu Anda tentang pelacakan cabang jarak jauh yang sesuai:

(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 kemudian akan mendorong ke cabang yang sesuai secara otomatis:

(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 [email protected]:bigben87/webbit.git
   1bf578c..268fb60  gh-pages -> gh-pages
Bengt
sumber
10

Tidak ingin mengedit file konfigurasi git saya, saya mengikuti info di pos @ mipadi dan menggunakan:

$ git pull origin master

sumber
13
Intinya adalah melakukan ini secara otomatis daripada menspesifikasikannya.
Eric
4

Pertanyaan langsung Anda tentang cara membuatnya menarik, Anda perlu melakukan apa yang dikatakannya. Tentukan refspec untuk menarik dari dalam konfigurasi cabang Anda.

[branch "master"]
    merge = refs/heads/master
Ryan Graham
sumber
Bukankah itu "ref / kepala / master"? Menurut git-pull (1), ini adalah nama cabang di situs jarak jauh yang digabungkan secara default.
Adam Monsen
Ya kamu benar Repo yang saya ambil contohnya adalah kasus khusus. Dikoreksi.
Ryan Graham
0

Hanya ingin menambahkan beberapa info itu, kita dapat memeriksa info ini apakah git pullsecara otomatis merujuk ke cabang apa pun atau tidak.

Jika Anda menjalankan perintah,, git remote show origin(dengan asumsi asal sebagai nama pendek untuk remote), git menampilkan info ini, apakah ada referensi default ada git pullatau tidak.

Di bawah ini adalah contoh keluaran. (Diambil dari dokumentasi 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)

Harap perhatikan bagian di mana ia ditampilkan, Cabang lokal dikonfigurasi untuk tarikan git.

Dalam hal ini, git pullakan merujukgit pull origin master

Awalnya, jika Anda telah mengkloning repositori, menggunakan git clone, hal-hal ini secara otomatis diurus. Tetapi jika Anda telah menambahkan remote secara manual menggunakan add remote git, ini tidak ada dari konfigurasi git. Jika demikian, maka bagian di mana ia menunjukkan "Cabang lokal yang dikonfigurasi untuk 'git pull':", akan hilang dari outputgit remote show origin .

Langkah selanjutnya yang harus diikuti jika tidak ada konfigurasi git pull, sudah dijelaskan oleh jawaban lain.

dr_dev
sumber