Git Kéo trong khi bỏ qua những thay đổi cục bộ?


489

Có cách nào để thực hiện git pullmà bỏ qua mọi thay đổi tệp cục bộ mà không làm mất thư mục và phải thực hiện git clonekhông?


17
"Bỏ qua" bạn có nghĩa là "ghi đè"?
Cascabel

@Cascabel Có nghĩa là hoàn nguyên tất cả các thay đổi cục bộ, không phổ biến tất cả các cam kết cục bộ, xóa tất cả các tệp và thư mục mới cục bộ, phục hồi tất cả các tệp và thư mục bị xóa cục bộ, v.v. Tóm lại, chỉ cần chạy một lệnh như thể rm -rf local_repo && git clone remote_url.
Victor

Câu trả lời:


820

Nếu bạn muốn nói rằng bạn muốn kéo ghi đè lên các thay đổi cục bộ, thực hiện hợp nhất như thể cây làm việc sạch sẽ, tốt, hãy làm sạch cây làm việc:

git reset --hard
git pull

Nếu có các tệp cục bộ chưa được mã hóa, bạn có thể sử dụng git cleanđể xóa chúng. Sử dụng git clean -fđể xóa các tệp không bị theo dõi, -dfđể xóa các tệp và thư -xdfmục không bị theo dõi và để xóa các tệp hoặc thư mục không bị theo dõi hoặc bỏ qua.

Mặt khác, nếu bạn muốn giữ các sửa đổi cục bộ bằng cách nào đó, bạn sẽ sử dụng stash để ẩn chúng đi trước khi kéo, sau đó áp dụng lại chúng sau đó:

git stash
git pull
git stash pop

Tuy nhiên, tôi không nghĩ sẽ bỏ qua các thay đổi theo nghĩa đen - một nửa số lần kéo là hợp nhất và cần phải hợp nhất các phiên bản nội dung đã cam kết với các phiên bản mà nó đã tìm nạp.


4
Nếu sau khi git resetcác tệp của bạn vẫn khác với điều khiển từ xa, hãy đọc stackoverflow.com/questions/1257592/ cấp
Đại tá Panic

3
Git là điều kỳ lạ nhất từng có. Git reset - đã xong. Sau đó, trạng thái git: Chi nhánh của bạn đi trước 2 lần xác nhận.
Shailen

21
@shailenTJ "Thay đổi cục bộ" ở đây có nghĩa là những thay đổi không được cam kết, không phải là cam kết cục bộ. git reset --hardảnh hưởng đến cái trước chứ không phải cái sau. Nếu bạn muốn thiết lập lại hoàn toàn về trạng thái của điều khiển từ xa, git reset --hard origin/<branch>- nhưng thường và trong trường hợp này, hai cam kết đó bạn đi trước nguồn gốc là công việc bạn đã làm, không phải là thứ bạn muốn vứt bỏ.
Cascabel

2
Vì vậy, đây là điều tương tự như phá hủy kho lưu trữ cục bộ và tải xuống lại, phải không? Tôi chỉ muốn có thể buộc các thay đổi kéo và ghi đè cho thuận tiện. 99% thời gian tôi nhận được thông báo lỗi này khi tôi vô tình làm hỏng một cái gì đó cục bộ và chỉ muốn bắt đầu lại từ repo.
sudo

Điều gì nếu bạn không thể có một sự thay đổi cục bộ so với đầu? Ví dụ: repo được tạo trên hệ thống tệp phân biệt chữ hoa chữ thường và được sao chép trên hệ thống tệp không phân biệt chữ hoa chữ thường và có 2 tệp có cùng tên khác nhau?
xster

305

Đối với tôi sau đây làm việc:

(1) Trước tiên hãy tìm nạp tất cả các thay đổi:

$ git fetch --all

(2) Sau đó đặt lại bản gốc:

$ git reset --hard origin/master

(3) Kéo / cập nhật:

$ git pull

22
Làm việc tuyệt vời cho tôi khi gặp nhiều rắc rối với câu trả lời hàng đầu. Cảm ơn!
0x0

6
điều này thậm chí hoạt động khi bạn đã thực hiện các thay đổi cục bộ của mình, nhưng bạn vẫn muốn hoàn nguyên
agsachin

16
Đây phải là câu trả lời hàng đầu :)
Purus

5
@Marco Servetto: Trước tiên, bạn tìm nạp tất cả các thay đổi git của mình, nhưng chưa áp dụng chúng. Sau đó, bạn đặt lại chủ về trạng thái cuối cùng (cập nhật). Nếu bạn bỏ qua bước đầu tiên, bạn sẽ hoàn nguyên các thay đổi về chủ cũ (cục bộ). Từ kinh nghiệm của tôi, cách tôi mô tả nó, không bao giờ gây ra vấn đề. Tất cả các nỗ lực khác làm vào cuối.
Artur Barseghyan

1
Điều này làm việc cho tôi, tôi muốn bỏ qua tất cả các thay đổi cục bộ của mình, bao gồm khôi phục các tệp đã bị xóa
Neri

28

Bạn chỉ muốn một lệnh cho kết quả chính xác như rm -rf local_repo && git clone remote_url, phải không? Tôi cũng muốn tính năng này. Tôi tự hỏi tại sao git không cung cấp một lệnh như vậy (chẳng hạn như git reclonehoặc git sync), svn cũng không cung cấp một lệnh như vậy (chẳng hạn như svn recheckouthoặc svn sync).

Hãy thử lệnh sau:

git reset --hard origin/master
git clean -fxd
git pull

Đó là những gì thực sự hoạt động, ngay cả khi bạn đã có các cam kết cục bộ mà bạn muốn xóa.
Yuri Ghensev

5
Cảnh báo các bạn !! git clean -fxdloại bỏ các tập tin từ .gitignorecũng.
Ramesh Navi

@RameshNavi Chắc chắn. Đây chính xác là những gì đang muốn. Điều muốn là có một cách nhanh hơn để sao chép lại nó, tức là xóa toàn bộ repo cục bộ và sau đó sao chép nó.
Victor

27

Lệnh dưới đây sẽ không hoạt động . Nếu bạn làm chỉ:

$ git checkout thebranch
Already on 'thebranch'
Your branch and 'origin/thebranch' have diverged,
and have 23 and 7 different commits each, respectively.

$ git reset --hard
HEAD is now at b05f611 Here the commit message bla, bla

$ git pull
Auto-merging thefile1.c
CONFLICT (content): Merge conflict in thefile1.c
Auto-merging README.md
CONFLICT (content): Merge conflict in README.md
Automatic merge failed; fix conflicts and then commit the result.

và như thế...

Để thực sự bắt đầu lại, tải xuống thebranch và ghi đè tất cả các thay đổi cục bộ của bạn, chỉ cần làm:


$ git checkout thebranch
$ git reset --hard origin/thebranch

Điều này sẽ làm việc tốt.

$ git checkout thebranch
Already on 'thebranch'
Your branch and 'origin/thebranch' have diverged,
and have 23 and 7 different commits each, respectively.

$ git reset --hard origin/thebranch
HEAD is now at 7639058 Here commit message again...

$ git status
# On branch thebranch
nothing to commit (working directory clean)

$ git checkout thebranch
Already on 'thebranch'

4
ĐÚNG. Đây là những gì tôi cần cho một cách tiếp cận "không cung cấp cho F về những gì địa phương" cuối cùng. Cảm ơn. :)
Adambean


8

Nhìn vào git stash để đặt tất cả các thay đổi cục bộ của bạn vào một "tệp stash" và trở lại cam kết cuối cùng. Tại thời điểm đó, bạn có thể áp dụng các thay đổi được sắp xếp của mình hoặc loại bỏ chúng.


8

Nếu bạn đang dùng Linux:

git fetch
for file in `git diff origin/master..HEAD --name-only`; do rm -f "$file"; done
git pull

Vòng lặp for sẽ xóa tất cả các tệp được theo dõi được thay đổi trong repo cục bộ, do đó git pullsẽ hoạt động mà không gặp vấn đề gì.
Điều thú vị nhất về điều này là chỉ các tệp được theo dõi sẽ bị ghi đè bởi các tệp trong repo, tất cả các tệp khác sẽ không bị ảnh hưởng.


Tôi nghĩ bạn có nghĩa là "tập tin được theo dõi", đó chính xác là những gì tôi cần, cảm ơn.
Ali

bất kỳ tương đương cho Powershell?
Earlee

8

cách ngắn nhất để làm điều đó là:

git pull --rebase --autostash

không biết về --autostashtrước, cảm ơn!
shiro

7

cái này làm việc cho tôi

git fetch --all
git reset --hard origin/master
git pull origin master

với câu trả lời được chấp nhận tôi nhận được lỗi xung đột


Điều đó rất giống với câu trả lời năm 2015 của Artur Barseghyan ... nhưng tôi vẫn muốn biết mục đích của lệnh thứ 3 là gì: các tệp làm việc đã thay đổi sau lệnh thứ 2 và lệnh thứ 3 nói "Đã cập nhật "
mike gặm nhấm

đó là sự kết hợp duy nhất hoạt động trên môi trường của tôi, có lẽ bạn đang thấy một điều khác, đối với tôi, tôi cần ba lệnh
Pablo Pazos

Hấp dẫn. Có thể là một điều phiên bản. Tôi đang trên git 2.7.4. Nhưng tôi cũng vừa thấy một bình luận mới từ Artur Barseghyan: "Nếu không, bạn có thể thấy mình đang làm việc với chủ nhân vô tình lỗi thời."
mike gặm nhấm

có thể, nhưng điều duy nhất tôi có thể nói là "điều này hiệu quả với tôi khi không có giải pháp nào khác", vì vậy nó có thể giúp đỡ người khác
Pablo Pazos


2

Điều này sẽ tìm nạp chi nhánh hiện tại và cố gắng tiến nhanh tới chủ:

git fetch && git merge --ff-only origin/master

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.