git kéo giữ thay đổi cục bộ


132

Làm cách nào tôi có thể cập nhật (kéo) một dự án git một cách an toàn, giữ cho các tệp cụ thể không bị ảnh hưởng, ngay cả khi có những thay đổi ngược dòng?

myrepo / config / config.php

Có cách nào, ngay cả khi tập tin này được thay đổi trên remote, khi tôi git pull, mọi thứ khác đều được cập nhật, nhưng tập tin này không thay đổi (thậm chí không được hợp nhất)?

Tái bút Tôi cần phải làm những gì tôi đang yêu cầu bởi vì tôi chỉ viết các kịch bản triển khai dựa trên git. Tôi không thể thay đổi tập tin cấu hình thành mẫu.

vì vậy, tôi cần cách viết các kịch bản cập nhật mà không mất đi những gì đã thay đổi cục bộ. Tôi đã hy vọng cho một cái gì đó đơn giản như:

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

sau đó git pull


Là những thay đổi để config.phpcam kết?
Đánh dấu Longair


Nó không cam kết. Tôi thà không phải
Johnny Everson

@JhonnyEverson: Đó là cùng một loại vấn đề (Bạn có tệp cấu hình và bạn không muốn cam kết cài đặt cụ thể, nhưng cấu trúc tệp cấu hình cần phải được theo dõi.)
Daenyth

Câu trả lời:


248

Có một giải pháp đơn giản dựa trên Git stash. Bỏ tất cả mọi thứ bạn đã thay đổi, lấy tất cả những thứ mới, áp dụng stash của bạn.

git stash
git pull
git stash pop

Trên stash pop có thể có xung đột. Trong trường hợp bạn mô tả trên thực tế sẽ có một cuộc xung đột config.php. Nhưng, giải quyết xung đột là dễ dàng bởi vì bạn biết rằng những gì bạn đặt trong stash là những gì bạn muốn. Vì vậy, làm điều này:

git checkout --theirs -- config.php

5
mà kiểm tra git - lệnh theirs rất khó hiểu. Nó đã làm những gì tôi muốn một lần và một cái gì đó thực sự tồi tệ vào một lần khác. Có bất kỳ tài liệu tốt về nó?
Milimetric

3
Vâng, đôi khi "của họ" và "của chúng ta" có thể gây nhầm lẫn. Trong một git merge"của chúng ta" là những gì hiện đang có trong thư mục làm việc. Nhưng đối với một git rebase(hoặc git rebase -onto) ý nghĩa có thể bị hoán đổi.
GoZoner

1
git stash , git pull , git stash apply Bạn có thể thả stash với: git stash dropSau khi bạn hợp nhất các thay đổi thành công
BeingSuman

11
Điều với git là bạn phải hiểu những gì nó sẽ làm. Một điều khác với git, là ngay cả đối với những người thông minh, thường rất khó để hiểu git sẽ làm gì.
Brad Thomas

1
Bạn nên kiểm tra xem có thực tế gì không. Nếu không, bạn sẽ bật stash thay đổi từ trước đó git stash.
Jorn Reimerdes

15

Nếu bạn có một tệp trong repo của mình rằng nó được cho là tùy chỉnh bởi hầu hết các trình kéo, sau đó đổi tên tệp thành một cái gì đó giống như config.php.templatevà thêm config.phpvào của bạn .gitignore.


5
kiểm tra câu trả lời này quá, bạn có thể sử dụng .gitattributesđể luôn giữ các thay đổi của bạn trong khi hợp nhất.
KurzingMetal

Điều đó giống như những gì tôi cần. Điều mẫu là giải pháp tao nhã nhưng tôi e rằng tôi không thể sử dụng nó vì tôi chỉ đang viết các kịch bản triển khai.
Johnny Everson

6

Cập nhật: điều này thực sự trả lời câu hỏi được hỏi, nhưng tôi nghĩ câu trả lời của KurzingMetal thực sự là những gì bạn muốn.

Giả sử rằng:

  1. Bạn đang ở chi nhánh master
  2. Chi nhánh thượng nguồn là mastertrongorigin
  3. Bạn không có thay đổi không cam kết

.... bạn có thể làm:

# 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

Bạn có thể tạo một bí danh cho điều đó nếu bạn cần làm điều đó thường xuyên. Lưu ý rằng nếu bạn có những thay đổi không được cam kết config/config.php, điều này sẽ ném chúng đi.



1

Để trả lời câu hỏi: nếu bạn muốn loại trừ một số tệp nhất định của thanh toán, bạn có thể sử dụng thanh toán thưa thớt

1) Trong .git/info/sparse-checkout, xác định những gì bạn muốn giữ. Ở đây, chúng tôi muốn tất cả (*) nhưng (lưu ý dấu chấm than) config.php:

 /*
 !/config.php

2) Nói với git bạn muốn kiểm tra thưa thớt vào tài khoản

 git config core.sparseCheckout true

3) Nếu bạn đã có tệp này cục bộ, hãy thực hiện những gì git thực hiện khi thanh toán thưa thớt (nói với nó là phải loại trừ tệp này bằng cách đặt cờ "Skip-worktree" trên đó)

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

4) Tận hưởng kho lưu trữ trong đó tệp config.php là của bạn - mọi thay đổi đều có trên kho lưu trữ.


Xin lưu ý rằng các giá trị cấu hình KHÔNG NÊN kiểm soát nguồn:

  • Đây là một vi phạm an ninh tiềm năng
  • Nó gây ra vấn đề như thế này để triển khai

Điều này có nghĩa là bạn PHẢI loại trừ chúng (đặt chúng vào .gitignore trước lần cam kết đầu tiên) và tạo tệp thích hợp trên mỗi phiên bản nơi bạn kiểm tra ứng dụng của mình (bằng cách sao chép và điều chỉnh tệp "mẫu")

Lưu ý rằng, một khi một tập tin được git phụ trách, .gitignore sẽ không có hiệu lực.

Cho rằng, một khi tệp nằm dưới sự kiểm soát nguồn, bạn chỉ có hai lựa chọn (): - rebase tất cả lịch sử của bạn để xóa tệp (với git filter-branch) - tạo một cam kết loại bỏ tệp. Nó giống như chiến đấu một trận thua, nhưng, tốt, đôi khi bạn phải sống với điều đó.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.