Kapan saya perlu melakukan "git pull", sebelum atau sesudah "git add, git commit"?

93

Bagaimana cara yang benar?

git add foo.js
git commit foo.js -m "commit"
git pull
git push

Atau

git pull
git add foo.js
git commit foo.js -m "commit"
git push

Atau

git add foo.js
git pull
git commit foo.js -m "commit"
git push

UPD:

Saya lupa menyebutkan bahwa dalam kasus ini saya gunakan git adduntuk mementaskan file yang dilacak dan dimodifikasi . Tidak memasukkan file baru ke repositori. Apakah ini mengubah urutan perintah?

hijau
sumber
Pertanyaan terkait: stackoverflow.com/questions/813822/…
leo9r

Jawaban:

97

Menurut saya cara terbaik untuk melakukannya adalah:

Simpan perubahan lokal Anda:

git stash

Perbarui cabang ke kode terbaru

git pull

Gabungkan perubahan lokal Anda ke dalam kode terbaru:

git stash apply

Tambahkan, komit, dan dorong perubahan Anda

git add
git commit
git push

Dalam pengalaman saya, ini adalah jalan menuju resistensi paling rendah dengan Git (pada baris perintah).

johnjo
sumber
4
Bisakah Anda menjelaskan mengapa ini lebih baik? Masalah apa yang dihindari ini? Secara khusus, mengapa ini lebih baik daripada commit> pull> push sederhana? (Saya merasa ini bisa menjadi jawaban terbaik, tetapi tidak memiliki cukup informasi sekarang bahkan untuk dianggap sebagai jawaban yang baik.)
dallin
7
Mungkin ini terlalu anekdot tetapi saya selalu menemukan pendekatan ini (pada baris perintah daripada dengan sesuatu seperti pohon sumber) jauh lebih mudah. Melakukan komit dan kemudian menarik, saat bekerja dalam tim besar, selalu menyebabkan konflik penggabungan yang besar karena git tidak pandai menggabungkan perubahan saya ke file dengan file yang masuk. Dengan menyembunyikan, ini memungkinkan saya untuk menarik perubahan baru dan kemudian menggunakan kode yang diperbarui sebagai dasar untuk menambahkan perubahan saya. Berurusan dengan konflik lebih mudah karena lebih jelas bagi saya (karena perubahan saya sekarang adalah konflik). Kalau dipikir-pikir, mungkin itu lebih mudah untuk situasi saya.
johnjo
1
Jadi ini terdengar seperti semacam "Bagaimana Anda makan gajah? Satu gigitan pada satu waktu". yaitu Memecah proses menjadi beberapa langkah lagi untuk menyederhanakan penggabungan agar memiliki perubahan yang lebih sedikit dan mungkin lebih jelas. Masuk akal.
dallin
Apakah git add diperlukan di sini? Jika semua file sudah ditambahkan ke pementasan!
Sharp Edge
Bagaimana jika Anda tidak menggunakan git stash?
Aaron Franke
76

tarik = ambil + gabung.

Anda perlu melakukan apa yang telah Anda lakukan sebelum menggabungkan.

Jadi tarik setelah komit.

Arnaud Denoyelle
sumber
8
Apakah ini berarti Anda akhirnya membuat komitmen ekstra untuk setiap komitmen yang Anda buat dan membuat repo ceroboh? Juga pesan komit awal Anda berakhir diikuti oleh komentar gabungan setiap kali. Jika demikian, saya akan cenderung menggunakan metode simpanan yang disebutkan di bawah oleh @johnjo.
MondayPaper
3
@DanielM Ya, ada komit tambahan untuk penggabungan (dengan pesan komit default eksplisit). Ini adalah hal yang cukup baik karena memungkinkan Anda untuk menyelesaikan komit terakhir Anda atau komit terakhir kolega Anda atau komit gabungan. Jika Anda ingin menghindarinya dan jika Anda ingin menempatkan komit setelah rekan kerja Anda melakukan, Anda bisa rebasemelakukannya merge. Anda dapat melakukannya dengan salah satu git commit && git rebaseatau git pull --rebase.
Arnaud Denoyelle
Terima kasih atas tipnya, @Arnaud. Setelah membaca banyak pertanyaan SO yang berbeda, komentar ini berhasil. Pilihan yang saya sukai ketika rekan kerja mengerjakan file yang berbeda adalah git pullsetelah melakukan perubahan, karena menurut saya paling alami. Meskipun saya menyadari banyak alur kerja yang berbeda berfungsi (simpanan juga bagus), jadi mungkin ini masalah selera.
keponakan
51

Saya menyarankan untuk menarik dari cabang jarak jauh sesering mungkin untuk meminimalkan penggabungan besar dan kemungkinan konflik.

Karena itu, saya akan memilih opsi pertama:

git add foo.js
git commit foo.js -m "commit"
git pull
git push

Komit perubahan Anda sebelum menarik sehingga komitmen Anda digabungkan dengan perubahan jarak jauh selama penarikan. Hal ini dapat mengakibatkan konflik yang dapat Anda mulai tangani karena mengetahui bahwa kode Anda sudah digunakan jika terjadi kesalahan dan Anda harus membatalkan penggabungan karena alasan apa pun.

Saya yakin seseorang akan tidak setuju dengan saya, saya rasa tidak ada cara yang benar untuk melakukan aliran penggabungan ini, hanya yang terbaik untuk orang-orang.

Jasarien
sumber
1
Bisakah Anda melihat pembaruan saya untuk pertanyaan itu? Saya lupa menjelaskan untuk apa git adddigunakan persis dalam contoh saya.
Hijau
1
Tidak ada bedanya apakah itu file baru atau file yang dilacak / dimodifikasi. Masih berkomitmen dan kemudian menarik.
Jasarien
7

Saya pikir git pull --rebaseadalah cara terbersih untuk mengatur komit terbaru Anda secara lokal di atas komit jarak jauh yang tidak Anda miliki pada titik tertentu.

Jadi dengan cara ini Anda tidak perlu menarik setiap kali Anda ingin mulai membuat perubahan.

Mohyaddin Alaoddin
sumber
Ini juga yang saya lakukan, tetapi hanya untuk menunjukkan bahwa pasti ada dua aliran pemikiran utama tentang ini (berpusat di sekitar apakah yang terbaik untuk memperbaiki konflik di seluruh komitmen individu, atau sekali dalam komitmen gabungan) dengan Linus sendiri di kamp gabungan . Untungnya alat itu sendiri tidak beropini, jadi gunakan bagaimanapun juga yang terbaik untuk Anda & kebutuhan proyek Anda :-)
Luke Usherwood
3

Anda ingin perubahan Anda berada di atas status cabang jarak jauh saat ini. Jadi, mungkin Anda ingin menarik diri sebelum Anda berkomitmen. Setelah itu, dorong kembali perubahan Anda.

File lokal "kotor" tidak akan menjadi masalah selama tidak ada konflik dengan cabang jarak jauh. Jika ada konflik, penggabungan akan gagal, jadi tidak ada risiko atau bahaya dalam menarik sebelum melakukan perubahan lokal.

AlexE
sumber
1
Tidak akan berhasil, seperti yang disebutkan Arnaud, menarik mengharuskan Anda melakukan perubahan terlebih dahulu.
Jasarien
Kegembiraan saya tampaknya senang menarik dengan banyak perubahan lokal. Tentu saja, jika file yang sama diubah di cabang jarak jauh, bagian gabungan dari penarikan gagal. Untuk membuat konflik penggabungan yang tepat, saya harus berkomitmen terlebih dahulu, tentu. Jadi, jika kumpulan file yang diubah secara lokal dan jarak jauh terputus-putus, menarik dan kemudian melakukan baik-baik saja. Jika tidak, git tidak akan menarik. Tidak ada kerusakan yang bisa dilakukan dengan mencoba.
AlexE
Ini adalah opsi yang saya sukai ketika orang-orang mengerjakan file yang berbeda, dan menurut saya itu yang paling alami.
keponakan