git pull menjaga perubahan lokal

132

Bagaimana saya bisa memperbarui (menarik) proyek git dengan aman, menjaga file tertentu tidak tersentuh, bahkan jika ada perubahan di hulu?

myrepo / config / config.php

Apakah ada cara, dari, bahkan jika file ini sedang diubah pada jarak jauh, ketika saya git pull, semuanya diperbarui, tetapi file ini tidak berubah (bahkan tidak digabung)?

PS. Saya perlu melakukan apa yang saya minta karena saya hanya menulis skrip deploy berbasis git. Saya tidak dapat mengubah file konfigurasi ke template.

jadi, saya perlu cara untuk menulis skrip pembaruan yang tidak kehilangan apa yang diubah secara lokal. Saya berharap untuk sesuatu yang sederhana seperti:

git assume-remote-unchanged file1
git assume-remote-unchanged file2

kemudian git pull

Johnny Everson
sumber
Apakah perubahan tersebut config.phpdilakukan?
Mark Longair
Itu tidak berkomitmen. Saya lebih suka tidak perlu
Johnny Everson
@JhonnyEverson: Ini kelas masalah yang sama secara keseluruhan (Anda memiliki file konfigurasi dan Anda tidak ingin melakukan pengaturan tertentu, tetapi struktur file konfigurasi perlu dilacak.)
Daenyth

Jawaban:

248

Ada solusi sederhana berdasarkan simpanan Git. Simpan semua yang telah Anda ubah, tarik semua barang baru, terapkan simpanan Anda.

git stash
git pull
git stash pop

Di stash pop mungkin ada konflik. Jika Anda jelaskan akan ada konflik untuk config.php. Tetapi, menyelesaikan konflik itu mudah karena Anda tahu bahwa apa yang Anda masukkan ke dalam simpanan adalah apa yang Anda inginkan. Jadi lakukan ini:

git checkout --theirs -- config.php
GoZoner
sumber
5
git checkout - perintah mereka sangat membingungkan. Itu melakukan apa yang saya inginkan sekali dan sesuatu yang sangat buruk di lain waktu. Punya dokumentasi yang bagus?
Milimetri
3
Ya, terkadang 'milik mereka' dan 'milik kita' dapat membingungkan. Dalam git merge'milik kita' adalah apa yang saat ini ada di direktori kerja. Tetapi untuk git rebase(atau git rebase -onto) maknanya bisa ditukar.
GoZoner
1
git stash , git pull , git stash apply Anda dapat membatalkan simpanan dengan: git stash dropSetelah berhasil menggabungkan perubahan
BeingSuman
11
Masalahnya dengan git adalah Anda harus memahami apa yang akan dilakukan. Hal lain dengan git, adalah bahwa bahkan untuk orang pintar seringkali sangat sulit untuk memahami apa yang akan dilakukan git.
Brad Thomas
1
Anda harus memeriksa apakah sebenarnya ada sesuatu untuk disimpan. Kalau tidak, Anda akan memunculkan perubahan simpanan dari yang sebelumnya git stash.
Jörn Reimerdes
15

Jika Anda memiliki file dalam repo yang seharusnya dikustomisasi oleh sebagian besar penarik, maka ganti nama file tersebut menjadi sesuatu seperti config.php.templatedan tambahkan config.phpke file Anda .gitignore.

Logam Kurzed
sumber
5
periksa jawaban ini juga, yang bisa Anda gunakan .gitattributesuntuk selalu menyimpan perubahan saat penggabungan.
KurzedMetal
Itu lebih seperti apa yang saya butuhkan. Masalah template adalah solusi elegan tapi saya khawatir saya tidak bisa menggunakan ini karena saya hanya menulis skrip deploy.
Johnny Everson
6

Perbarui: ini benar-benar menjawab pertanyaan yang diajukan, tetapi saya pikir jawaban KurzedMetal benar-benar yang Anda inginkan.

Berasumsi bahwa:

  1. Anda berada di cabang master
  2. Cabang hulu berada masterdiorigin
  3. Anda tidak memiliki perubahan yang tidak dikomit

.... kamu bisa melakukan:

# Do a pull as usual, but don't commit the result:
git pull --no-commit

# Overwrite config/config.php with the version that was there before the merge
# and also stage that version:
git checkout HEAD config/config.php

# Create the commit:
git commit -F .git/MERGE_MSG

Anda dapat membuat alias untuk itu jika Anda harus sering melakukannya. Perhatikan bahwa jika Anda memiliki perubahan tanpa komitmen config/config.php, ini akan membuangnya.

Mark Longair
sumber
4

Kita juga bisa mencoba git pull dengan rebase

git pull --rebase origin dev
Bhavesh Maniya
sumber
1

Untuk menjawab pertanyaan: jika Anda ingin mengecualikan file checkout tertentu, Anda dapat menggunakan checkout jarang

1) Masuk .git/info/sparse-checkout, tentukan apa yang ingin Anda simpan. Di sini, kami ingin semua (*) tetapi (perhatikan tanda seru) config.php:

 /*
 !/config.php

2) Beri tahu git bahwa Anda ingin jarang melakukan checkout

 git config core.sparseCheckout true

3) Jika Anda sudah mendapatkan file ini secara lokal, lakukan apa yang dilakukan git pada checkout yang jarang (beri tahu ia harus mengecualikan file ini dengan mengatur flag "skip-worktree" di atasnya)

git update-index --skip-worktree config.php

4) Nikmati repositori di mana file config.php Anda adalah milik Anda - perubahan apa pun yang ada di repositori.


Harap dicatat bahwa nilai konfigurasi TIDAK HARUS berada dalam kontrol sumber:

  • Ini merupakan pelanggaran keamanan potensial
  • Ini menyebabkan masalah seperti ini untuk penyebaran

Ini berarti Anda HARUS mengecualikan mereka (memasukkannya ke dalam .gitignore sebelum komit pertama), dan membuat file yang sesuai pada setiap contoh tempat Anda checkout aplikasi Anda (dengan menyalin dan mengadaptasi file "templat")

Perhatikan bahwa, begitu file diambil oleh git, .gitignore tidak akan berpengaruh apa pun.

Karena itu, setelah file berada di bawah kendali sumber, Anda hanya memiliki dua pilihan (): - rebase semua riwayat Anda untuk menghapus file (dengan git filter-branch) - buat komit yang menghapus file. Ini seperti bertempur dalam pertempuran yang sulit, tetapi, yah, terkadang Anda harus hidup dengan itu.

Pierre-Olivier Vares
sumber
0

Jika ada perubahan lokal yang tidak dikomit dan hindari menggabungkan konflik saat menarik.

git stash save
git pull
git stash pop

refer - https://happygitwithr.com/pull-tricky.html

Ujjwal Roy
sumber