git: Làm thế nào để tôi có được phiên bản mới nhất của mã của mình?


200

Tôi đang sử dụng Git 1.7.4.1. Tôi muốn lấy phiên bản mã mới nhất của mình từ kho lưu trữ, nhưng tôi đang gặp lỗi ...

$ git pull
….
M   selenium/ant/build.properties
….
M   selenium/scripts/linux/get_latest_updates.sh
M   selenium/scripts/windows/start-selenium.bat
Pull is not possible because you have unmerged files.
Please, fix them up in the work tree, and then use 'git add/rm <file>' as appropriate to mark resolution, or use 'git commit -a'.

Tôi đã xóa các bản sao cục bộ của các tệp mà công cụ đang khiếu nại, nhưng tôi vẫn nhận được các lỗi. Làm cách nào để kiểm tra phiên bản mới nhất từ ​​repo từ xa? - Dave


1
Câu trả lời của @ Kzqai dưới đây đã giúp tôi: hãy thử làm git fetchtrước. Tôi đã không nhận được xung đột, nhưng đó là cách tôi có phiên bản mã mới nhất.
Chris K

Câu trả lời:


258

Nếu bạn không quan tâm đến bất kỳ thay đổi cục bộ nào (bao gồm các tệp hoặc phần phụ không được theo dõi hoặc được tạo ra ở đây) và chỉ muốn một bản sao từ repo:

git reset --hard HEAD
git clean -xffd
git pull

Một lần nữa, điều này sẽ nuke bất kỳ thay đổi nào bạn đã thực hiện tại địa phương vì vậy hãy sử dụng cẩn thận. Hãy suy nghĩ về rm -Rfkhi làm điều này.


1
Tôi đã thử các lệnh này và vẫn gặp lỗi, "CONFLICT (nội dung): Hợp nhất xung đột trong selenium / ant / build.xml" (trong số các lệnh khác). Tôi chỉ muốn ghi đè lên phiên bản mới nhất của tệp của tôi với nội dung trong repo. Tôi có thể làm gì??
Dave

31
git clean -fkhông thực sự là một phần của câu trả lời. Nó sẽ xóa các tệp không được lưu trong kho (ví dụ trong trường hợp của tôi, tệp nhật ký); bạn không cần phải làm điều này để git pulllàm việc trở lại, chỉ cần git reset --hard HEADlà đủ.
Darren Cook

12
Esh, anh bạn, không đề xuất một trong số ít các lệnh xóa để thu hút người mới.
Kzqai

6
@DarrenCook Tôi nghĩ rằng điều đó git clean -frất quan trọng nếu bạn muốn dọn dẹp kho lưu trữ thực sự của mình. Nó tương đương với việc thực hiện "Xóa tất cả khỏi thư mục -> Nhận phiên bản mới nhất / Nhận cụ thể" trong TFS và trong trường hợp của tôi, đây là điều tôi muốn.
RPDeshaies

3
@Darren Tôi nghĩ git sạch -f`` cũng quan trọng. Tôi muốn có phiên bản mới nhất và không muốn giữ các mục lưu trữ lỗi thời hoặc các tài nguyên được tạo khác không có trên repo. Câu trả lời là rõ ràng về thực tế rằng nó sẽ loại bỏ thay đổi cục bộ và bắt chước phiên bản cuối cùng từ repo, vì vậy nó có vẻ hoàn hảo với tôi. Tôi sẽ chuyển các tệp nhật ký của mình đến một nơi khác nếu tôi thực sự cần giữ chúng giữa các lần cập nhật.
Balmipour

231

Trường hợp 1: Đừng quan tâm đến những thay đổi cục bộ

  • Giải pháp 1: Nhận mã mới nhất và đặt lại mã

    git fetch origin
    git reset --hard origin/[tag/branch/commit-id usually: master]
    
  • Giải pháp 2: Xóa thư mục và sao chép lại: D

    rm -rf [project_folder]
    git clone [remote_repo]
    

Trường hợp 2: Quan tâm đến những thay đổi cục bộ

  • Giải pháp 1: không có xung đột với phiên bản trực tuyến mới

    git fetch origin
    git status
    

    sẽ báo cáo một cái gì đó như:

    Your branch is behind 'origin/master' by 1 commit, and can be fast-forwarded.
    

    Sau đó lấy phiên bản mới nhất

    git pull
    
  • Giải pháp 2: xung đột với phiên bản trực tuyến mới

    git fetch origin
    git status
    

    sẽ báo cáo một cái gì đó như:

    error: Your local changes to the following files would be overwritten by merge:
        file_name
    Please, commit your changes or stash them before you can merge.
    Aborting
    

    Cam kết thay đổi địa phương của bạn

    git add .
    git commit -m ‘Commit msg’
    

    Cố gắng để có được những thay đổi (sẽ thất bại)

    git pull
    

    sẽ báo cáo một cái gì đó như:

    Pull is not possible because you have unmerged files.
    Please, fix them up in the work tree, and then use 'git add/rm <file>'
    as appropriate to mark resolution, or use 'git commit -a'.
    

    Mở tệp xung đột và sửa lỗi xung đột. Sau đó:

    git add .
    git commit -m ‘Fix conflicts’
    git pull
    

    sẽ báo cáo một cái gì đó như:

    Already up-to-date.
    

Thông tin thêm: Làm cách nào để tôi sử dụng 'git reset --hard Head' để trở lại cam kết trước đó?


@ tvl. Làm thế nào tôi có thể nhận được các bản cập nhật mới nhất mà không cam kết mã của mình (có xung đột) với chi nhánh .. xin vui lòng giúp tôi
user3354456

@ user3354457 xm, câu hỏi thú vị. Tôi chưa bao giờ thử điều này trước đây nhưng bạn có thể thử và báo cáo lại;) vì vậy: - Tạo một bản vá với các thay đổi: git diff> unsommited-thay.p.patch - Đặt lại chi nhánh - kéo các thay đổi - áp dụng bản vá
tvl

3
Câu trả lời này xứng đáng được nâng cao hơn nhiều so với câu trả lời đã được chấp nhận như một câu trả lời.
James

@James :) Tôi rất vui vì câu trả lời của tôi giúp bạn. Mẹo, hãy thử viết tài liệu như bạn không biết gì về một chủ đề và chắc chắn tính dài dòng sẽ giúp bạn trở lại.
tvl

4
Câu trả lời đầy đủ nhất cho git fetch. Bài đăng này nên được khóa
Callat

17

Tôi nghi ngờ rằng những gì đã xảy ra có thể là bạn đã xóa các tệp mà bạn đã sửa đổi (vì bạn không quan tâm đến những thay đổi đó) và bây giờ git đang xóa việc thay đổi.

Đây là một cách tiếp cận để chuyển các thay đổi của bạn ra khỏi bản sao làm việc của bạn và vào "stash" (có thể truy xuất được nếu bạn thực sự cần chúng một lần nữa), do đó bạn có thể kéo các thay đổi mới nhất xuống từ thượng nguồn.

git stash  
git pull

Nếu bạn muốn lấy lại các tệp của mình (xung đột tiềm ẩn với các thay đổi ngược dòng và tất cả), hãy chạy một git stash applyđể dán các thay đổi đó lên trên mã của bạn. Bằng cách đó, bạn có một cách tiếp cận "hoàn tác".


1
Có lẽ tôi khuyên bạn nên sử dụng git stash poptrừ khi bạn muốn có lịch sử sử dụng git của mình
Rapnar

7

Bạn phải hợp nhất các tập tin của bạn đầu tiên. Làm một git statusđể xem các tập tin cần được hợp nhất là gì (có nghĩa là bạn cần giải quyết các xung đột trước). Một khi điều này được thực hiện, làm git add file_mergedvà làm pulllại của bạn .


2
Cảm ơn. Tôi đã phải đối mặt với vấn đề này. Tôi có một số thay đổi trong các tệp làm việc của mình, điều mà tôi không muốn cam kết. Nhưng tôi không thể thực hiện một động tác git trong trường hợp này. Vì vậy, tôi làm - git stash, git pull --rebase, git stash pop. Sau đó, hợp nhất thủ công và git thêm file_merged
RuntimeException

6

thử mã này

cd /go/to/path
git pull origin master

5
Chào mừng bạn đến với Stackoverflow! Vui lòng xem xét thêm một số giải thích cho giải pháp của bạn để mô tả tốt hơn cách giải quyết vấn đề. Điều đó sẽ làm cho câu trả lời của bạn trở nên hữu ích hơn
dkackman

2

Nếu bạn chỉ muốn vứt bỏ mọi thứ trong thư mục làm việc của mình (ví dụ: kết quả của việc hợp nhất không thành công hoặc bị hủy bỏ) và trở lại cam kết sạch trước đó, hãy thực hiện a git reset --hard.


1

Tôi hiểu bạn muốn dọn rác những thay đổi cục bộ của bạn và kéo xuống những gì trên điều khiển từ xa của bạn?

Nếu vẫn thất bại và nếu bạn (khá dễ hiểu) sợ "thiết lập lại", điều đơn giản nhất là sao chép nguồn gốc vào một thư mục mới và bỏ rác thư mục cũ của bạn.


1

Bằng cách chạy lệnh này, bạn sẽ nhận được thẻ gần đây nhất thường là phiên bản của dự án của bạn:

git describe --abbrev=0 --tags

0

Tôi nghe có vẻ như bạn đang gặp vấn đề về core.autocrlf. core.autocrlf = true có thể đưa ra các vấn đề như những vấn đề bạn mô tả trên Windows nếu các dòng mới của CRLF được kiểm tra vào kho lưu trữ. Hãy thử vô hiệu hóa core.autocrlf cho kho lưu trữ và thực hiện thiết lập lại cứng.


0

Nếu bạn đang sử dụng GUI Git, trước tiên hãy tìm nạp sau đó hợp nhất.

Tìm nạp thông qua menu Remote >> Fetch >> Origin. Hợp nhất thông qua menu Hợp nhất >> Hợp nhất cục bộ.

Hộp thoại sau xuất hiện.

nhập mô tả hình ảnh ở đây

Chọn nút radio nhánh theo dõi (cũng được chọn theo mặc định), để trống ô màu vàng và nhấn merge và điều này sẽ cập nhật các tệp.

Tôi đã hoàn nguyên một số thay đổi cục bộ trước khi thực hiện các bước này vì tôi muốn loại bỏ những cách đó vì vậy tôi không phải loại bỏ thông qua hợp nhất sau này.

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.