Làm cách nào để kéo tệp từ xa mà không ghi đè tệp cục bộ?


112

Tôi đang cố gắng thiết lập git repo mới cho repo từ xa đã có từ trước.

Tôi muốn các tệp cục bộ của mình ghi đè lên repo từ xa, nhưng git nói rằng trước tiên tôi phải kéo các tệp từ xa đó vào và hợp nhất chúng.

Có cách nào để kéo nhưng đảm bảo rằng các tệp cục bộ không bị ghi đè bởi điều khiển từ xa không?

Câu trả lời:


181

Vâng, có, và không ...

Tôi hiểu rằng bạn muốn các bản sao cục bộ của mình "ghi đè" những gì có trong điều khiển từ xa, nhưng, bạn ơi, nếu ai đó đã sửa đổi các tệp trong kho lưu trữ từ xa theo một cách khác và bạn chỉ cần bỏ qua các thay đổi của họ và cố gắng "ép buộc" những thay đổi của riêng bạn mà không cần xem xét đến những xung đột có thể xảy ra, tốt, tôi khóc cho bạn (và đồng nghiệp của bạn) ;-)

Tuy nhiên, điều đó nói lên rằng, thực sự dễ dàng để làm "điều đúng ..."

Bước 1:

git stash

trong repo địa phương của bạn. Điều đó sẽ lưu các bản cập nhật cục bộ của bạn vào kho lưu trữ, sau đó hoàn nguyên các tệp đã sửa đổi của bạn trở lại trạng thái trước khi chỉnh sửa.

Bước 2:

git pull

để nhận bất kỳ phiên bản sửa đổi nào. Bây giờ, hy vọng rằng điều đó sẽ không nhận được bất kỳ phiên bản mới nào của tệp mà bạn đang lo lắng. Nếu không, thì bước tiếp theo sẽ hoạt động trơn tru. Nếu đúng , thì bạn có một số việc phải làm, và bạn sẽ rất vui vì đã làm được.

Bước 3:

git stash pop

Điều đó sẽ hợp nhất các phiên bản đã sửa đổi của bạn mà bạn đã lưu trữ ở Bước 1 với các phiên bản bạn vừa lấy ở Bước 2. Nếu mọi thứ diễn ra suôn sẻ, thì bạn đã sẵn sàng!

Mặt khác, nếu có xung đột thực sự giữa những gì bạn đã lấy ở Bước 2 và các sửa đổi của bạn (do người khác đang chỉnh sửa trong thời gian tạm thời), bạn sẽ tìm ra và được thông báo để giải quyết chúng. Làm đi.

Mọi thứ sẽ làm việc ra nhiều hơn theo cách này - nó có lẽ sẽ tiếp tục thay đổi của bạn mà không cần bất kỳ công việc thực tế từ phía bạn, trong khi cảnh báo bạn, vấn đề nghiêm trọng nghiêm trọng.


5
tại sao không chỉ có git commitnhững thay đổi cục bộ git pull?
Don Cheadle

10
Đôi khi tôi ở vào vị trí mà tôi không muốn cam kết mã, nhưng tôi muốn giữ nó trong máy cục bộ của mình, bộ lệnh này thực sự hữu ích cho việc này.
Vargan

3
Điều này không hữu ích nếu bạn có nhiều tệp, một số tệp bạn muốn ghi đè và một số tệp bạn không muốn ghi đè. Không có cách nào để nói với GIT bỏ qua tệp khi kéo? Tại sao .gitignore công việc chỉ dành cho đẩy, tôi không hiểu rằng quyết định thiết kế ở tất cả ...
Bobak Hashemi

25

Trước tiên, bạn có thể lưu trữ các thay đổi cục bộ của mình, sau đó kéo, sau đó mở kho lưu trữ.

git stash
git pull origin master
git stash pop

Bất kỳ thứ gì ghi đè các thay đổi từ điều khiển từ xa sẽ có xung đột mà bạn sẽ phải giải quyết theo cách thủ công.


4
Tôi đã cam kết những thay đổi cục bộ để nó nói có "không có thay đổi địa phương để tiết kiệm"
Joe Isaacson

tôi nghĩ, đây là chiến lược tốt nhất.
Jimmy Obonyo Abor

13

Vì vậy, bạn đã cam kết các thay đổi cục bộ của mình cho kho lưu trữ cục bộ của bạn. Sau đó, để nhận các thay đổi từ xa đối với kho lưu trữ cục bộ của bạn mà không cần thực hiện thay đổi đối với các tệp cục bộ, bạn có thể sử dụng git fetch. Trên thực tế git pulllà một hoạt động hai bước: không phá hủy git fetchtheo sau là a git merge. Xem Sự khác biệt giữa 'git pull' và 'git fetch' là gì?để thảo luận thêm.

Ví dụ chi tiết:

Giả sử kho lưu trữ của bạn giống như thế này (bạn đã thực hiện các thay đổi test2:

* ed0bcb2 - (HEAD, master) test2
* 4942854 - (origin/master, origin/HEAD) first

originkho lưu trữ như thế này (ai đó đã cam kết test1):

* 5437ca5 - (HEAD, master) test1
* 4942854 - first

Tại thời điểm này, git sẽ phàn nàn và yêu cầu bạn kéo trước nếu bạn cố gắng đẩy test2vào kho lưu trữ từ xa. Nếu bạn muốn xem test1 là gì mà không cần sửa đổi kho lưu trữ cục bộ của mình, hãy chạy điều này:

$ git fetch

Kho lưu trữ cục bộ kết quả của bạn sẽ như thế này:

* ed0bcb2 - (HEAD, master) test2 
| * 5437ca5 - (origin/master, origin/HEAD) test1 
|/  
* 4942854 - first 

Bây giờ bạn có các thay đổi từ xa trong một nhánh khác và bạn giữ nguyên các tệp cục bộ của mình.

Vậy tiếp theo là gì? Bạn có thể thực hiện một git merge, sẽ có hiệu ứng tương tự như git pull(khi kết hợp với trước đó git fetch), hoặc, như tôi muốn, làm một git rebase origin/masterđể áp dụng thay đổi của bạn origin/master, điều này mang lại cho bạn một lịch sử rõ ràng hơn.


cảm ơn vì giải thích git pull như một bước hai git fetch / git merge
cdabel
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.