Đồng bộ hóa kho lưu trữ Git cục bộ với một kho lưu trữ từ xa


297

Tôi muốn đồng bộ hóa kho lưu trữ cục bộ của mình với một kho lưu trữ từ xa để kho lưu trữ cục bộ của tôi trở thành bản sao 100% của kho lưu trữ từ xa - có nghĩa là nếu các tệp nhất định khác nhau trong các kho lưu trữ này, chúng tôi sẽ ghi đè lên các kho lưu trữ cục bộ với các kho lưu trữ từ xa và nếu có các tệp trong kho lưu trữ cục bộ không tồn tại trong điều khiển từ xa, các tệp cục bộ sẽ bị xóa.

Có cách nào để đạt được điều đó ngoài việc tạo một bản sao mới của kho lưu trữ từ xa không?

Câu hỏi tương tự như Sync repit cục bộ với remote trong một lần loại bỏ các thay đổi / cam kết cục bộ .


4
Luôn luôn khi tôi đến đây, tôi đang tìm cách Đồng bộ hóa một ngã ba
Martin Thoma

1
git fetch --prune
Fraanzadeh.sd

Câu trả lời:


342
git fetch --prune

-p, --prune
Sau khi tìm nạp, hãy xóa mọi nhánh theo dõi từ xa không còn tồn tại trên điều khiển từ xa. lựa chọn cắt tỉa


6
Đó là những gì tôi đang tìm kiếm! PS Lần sau tôi sẽ đọc kỹ các trang của người đàn ông hơn trước khi đào stackoverflow :-)
Sergiy Sokolenko

5
Có, git pull -pthực hiện tương tự - 'git pull chạy git fetch với các tham số đã cho và gọi git merge để hợp nhất các đầu chi nhánh được truy xuất vào nhánh hiện tại' - git-scm.com/docs/git-pull
jobwat

2
Sử dụng git fetch <remote> --prune, trong trường hợp ai đó chỉ cần --prunetừ xa cụ thể. ví dụ. git fetch upstream --prune.
Fery Wardiyanto

git fetch origin --pruneđể đồng bộ hóa repo địa phương của bạn với ngã ba của một upstreamdự án
Stuart Cardall

2
@SergiySokolenko đó là những gì chúng ta đều nói, nhưng sâu thẳm chúng ta biết SO đã trở nên thuận tiện hơn khi các trang của con người :-P
Marcello Romani

144

Các bước này sẽ làm điều đó:

git reset --hard HEAD
git clean -f -x -d -n

sau đó không có -n

Điều này sẽ chăm sóc tất cả các thay đổi địa phương. Bây giờ các cam kết ...

git status

và lưu ý các dòng như:

Your branch is ahead of 'xxxx' by N commits.

Ghi lại số 'N' ngay bây giờ:

git reset --hard HEAD~N
git pull

và cuối cùng:

git status

không hiển thị gì để thêm / cam kết. Mọi thứ đều sạch sẽ.

Tuy nhiên, một bản sao mới có thể làm tương tự (nhưng chậm nhiều).

=== Cập nhật ===

Khi kiến ​​thức git của tôi được cải thiện đôi chút theo thời gian, tôi đã nghĩ ra một cách đơn giản khác để làm điều tương tự. Đây là cách (# với lời giải thích). Trong khi trong chi nhánh làm việc của bạn:

git fetch # This updates 'remote' portion of local repo. 
git reset --hard origin/<your-working-branch>
# this will sync your local copy with remote content, discarding any committed
# or uncommitted changes.

Mặc dù các cam kết và thay đổi cục bộ của bạn sẽ biến mất khỏi tầm nhìn sau đó, nhưng có thể khôi phục các thay đổi đã cam kết, nếu cần thiết.


1
cảm ơn rất nhiều vì bản cập nhật hoạt động hoàn toàn tốt với github và bitbucket :)
CommonSenseCode

câu trả lời này là một trong những giải pháp đáng tin cậy nhất ở đây đối với tôi.
AlanH

95

Bạn cần hiểu rằng kho lưu trữ Git không chỉ là một cây thư mục và tệp, mà còn lưu trữ lịch sử của những cây đó - có thể chứa các nhánh và hợp nhất.

Khi tìm nạp từ kho lưu trữ, bạn sẽ sao chép tất cả hoặc một số nhánh ở đó vào kho lưu trữ của bạn. Chúng nằm trong kho lưu trữ của bạn dưới dạng "các nhánh theo dõi từ xa", ví dụ như các nhánh có tên như remotes/origin/masterthế.

Tìm nạp các xác nhận mới từ kho lưu trữ từ xa sẽ không thay đổi bất cứ điều gì về bản sao làm việc tại địa phương của bạn.

Bản sao làm việc của bạn thường có một cam kết kiểm tra, được gọi HEAD. Cam kết này thường là tiền boa của một trong những chi nhánh địa phương của bạn.

Tôi nghĩ rằng bạn muốn cập nhật chi nhánh địa phương của bạn (hoặc có thể tất cả các chi nhánh địa phương?) Thành chi nhánh từ xa tương ứng, và sau đó kiểm tra chi nhánh mới nhất.

Để tránh mọi xung đột với bản sao làm việc của bạn (có thể có thay đổi cục bộ), trước tiên bạn hãy xóa mọi thứ không được phiên bản (sử dụng git clean). Sau đó, bạn kiểm tra nhánh cục bộ tương ứng với nhánh từ xa mà bạn muốn cập nhật và sử dụng git resetđể chuyển nó sang nhánh từ xa được tìm nạp. ( git pullsẽ kết hợp tất cả các bản cập nhật của chi nhánh từ xa trong địa phương của bạn, có thể làm tương tự hoặc tạo một cam kết hợp nhất nếu bạn có các cam kết cục bộ.)

(Nhưng sau đó bạn sẽ thực sự mất bất kỳ thay đổi cục bộ nào - cả trong bản sao hoạt động và cam kết cục bộ. Hãy chắc chắn rằng bạn thực sự muốn điều này - nếu không thì sử dụng một chi nhánh mới, điều này sẽ tiết kiệm các cam kết cục bộ của bạn. Và sử dụng git stashđể lưu các thay đổi chưa được cam kết .)


Chỉnh sửa: Nếu bạn chỉ có một chi nhánh địa phương và đang theo dõi một chi nhánh từ xa, tất cả những gì bạn cần làm là

git pull

từ bên trong thư mục làm việc.

Điều này sẽ tìm nạp phiên bản hiện tại của tất cả các nhánh từ xa được theo dõi và cập nhật nhánh hiện tại (và thư mục làm việc) lên phiên bản hiện tại của nhánh từ xa mà nó đang theo dõi.


Nếu tôi thay đổi KHÔNG CÓ trong kho lưu trữ cục bộ của mình, chỉ a.) Muốn có một bản sao của mọi thứ từ xa và b.) Muốn hiển thị khả năng khác nhau giữa các phiên bản. Vì vậy, tôi KHÔNG cam kết, không thay đổi bất cứ điều gì = không có cập nhật / thay đổi cục bộ. Những lệnh nào tôi nên sử dụng định kỳ (ví dụ mỗi tuần hoặc lâu hơn) để đạt được hai chức năng trên? Xin vui lòng, trả lời KISS (Keep It Simple St ngu) - tôi cũng là một người không biết gì, và ofc sẽ RTFM - nhưng để bắt đầu cần sự giúp đỡ. ;)
kobame

Trong trường hợp đơn giản của bạn là một git pullđủ, tôi nghĩ. (Tôi đã cập nhật câu trả lời.)
Paŭlo Ebermann

Điều gì xảy ra nếu tôi có một số thay đổi cục bộ mà tôi không muốn cam kết. Bây giờ khi tôi thực hiện thao tác kéo, nó báo tôi phải cam kết hoặc bỏ qua chúng. Vì vậy, trong trường hợp này làm thế nào tôi có thể nói với git để ghi đè lên chúng và thực hiện việc kéo?
Harshana

89

Bạn muốn làm

git fetch --prune origin
git reset --hard origin/master
git clean -f -d

Điều này làm cho repo cục bộ của bạn chính xác như repo từ xa của bạn.

Hãy nhớ thay thế nguồn gốc và chủ với điều khiển từ xa và chi nhánh mà bạn muốn đồng bộ hóa.


2
nó cũng xóa tất cả các thư mục khỏi cài đặt npm và cài đặt bower, không được khuyến khích trừ khi bạn muốn cài đặt lại tất cả các phụ thuộc trong .gitignore
chwagssd

Nó không loại bỏ của tôi node_modules, nó hoạt động chính xác như tôi muốn.
Vahid Amiri

CẢNH BÁO: Nó xóa các tệp không bị theo dõi
Amit Yadav

Tôi đã mất tất cả dữ liệu của mình bằng mã này, tôi đã cố gắng đồng bộ hóa kho lưu trữ cục bộ của mình với kho git. Nhưng nó làm cho kho lưu trữ toàn cầu của tôi đồng bộ hóa với kho lưu trữ cục bộ của tôi.
Zahid Khan

10

Đặt lại và đồng bộ hóa kho lưu trữ cục bộ với chi nhánh từ xa

Lệnh: Nhớ thay thế nguồn gốc và chủ bằng điều khiển từ xa và nhánh mà bạn muốn đồng bộ hóa.

git fetch origin && git reset --hard origin/master && git clean -f -d

Hoặc từng bước:

git fetch origin
git reset --hard origin/master
git clean -f -d

Chi nhánh địa phương của bạn bây giờ là một bản sao chính xác (cam kết và tất cả) của chi nhánh từ xa.

Đầu ra lệnh:

Dưới đây là một ví dụ về việc chạy lệnh trên một bản sao cục bộ của Forge a git repository.

sharkbook:forge lbaxter$ git fetch origin && git reset --hard origin/master && git clean -f -d
HEAD is now at 356cd85 FORGE-680
Removing forge-example-plugin/
Removing plugin-container-api/
Removing plugin-container/
Removing shell/.forge_settings
sharkbook:forge lbaxter$

4

(Thông tin này được lấy từ Hướng dẫn sử dụng Git )

Tôi cũng đang học, vì vậy đây có thể không phải là một câu trả lời chính xác cho câu hỏi nhưng nó có thể giúp ai đó:

  1. Khi một kho lưu trữ từ xa ban đầu được sao chép các bản sao của tất cả các nhánh được lưu trữ trong kho lưu trữ cục bộ của bạn (xem chúng với git branch -r)
  2. Để cập nhật các bản sao này và làm cho chúng hiện tại (tức là đồng bộ hóa chúng với chi nhánh từ xa), hãy sử dụng git fetch . Điều này sẽ không ảnh hưởng đến bất kỳ bạn nào, các nhánh được tạo tùy chỉnh.
  3. Để ghi đè kiểm tra chi nhánh địa phương của bạn, hãy kiểm tra phiên bản mới của bất kỳ chi nhánh nào bạn đang làm việc (Giả sử bạn đã thực hiện git add origin /path/to/repository) sử dụng git checkout origin/branch_name, điều này sẽ ghi đè các thay đổi cục bộ của bạn trên chi nhánhbranch_name

3

Âm thanh như bạn muốn một tấm gương của kho lưu trữ từ xa:

git clone --mirror url://to/remote.git local.git

Lệnh đó tạo ra một kho lưu trữ trần. Nếu bạn không muốn một kho lưu trữ trần, mọi thứ sẽ phức tạp hơn.


3

Nếu bạn đang nói về việc đồng bộ một repo rẽ nhánh thì bạn có thể làm theo các bước sau.

Cách đồng bộ kho lưu trữ ngã ba từ git

  1. kiểm tra chi nhánh git hiện tại của bạn

    git branch

  2. kiểm tra để làm chủ nếu bạn không làm chủ

    git checkout master

  3. Tìm nạp kho lưu trữ ngược dòng nếu bạn có quyền truy cập chính xác

    git fetch upstream

  4. Nếu bạn gặp lỗi dưới đây thì hãy chạy

    git remote add upstream git@github.com:upstream_clone_repo_url/xyz.git

    fatal: 'upstream/master' does not appear to be a git repository  
    fatal: Could not read from remote repository.
    Please make sure you have the correct access rights and the repository exists.
    
  5. Bây giờ chạy lệnh dưới đây.

    git fetch upstream

  6. Bây giờ nếu bạn đang ở trên master thì hãy hợp nhất ngược dòng / master vào nhánh master

    git merge upstream/master

    Đó là nó!!

    Kiểm tra chéo thông qua git remotelệnh, cụ thể hơngit remote -v

    Nếu tôi cũng có các quyền đối với repo ngược dòng, tôi có thể tạo một nhánh ngược dòng cục bộ và thực hiện công việc sẽ đi ngược dòng ở đó.


Tại sao tôi phải thực hiện 5.git tìm nạp ngược dòng khi tôi đã gặp lỗi ở bước thứ ba?
Md Sifatul Hồi giáo

-2

Bạn có thể sử dụng móc git cho điều đó. Chỉ cần tạo một hook mà đẩy thay đổi sang repo khác sau khi cập nhật.

Tất nhiên bạn có thể nhận được xung đột hợp nhất vì vậy bạn phải tìm cách giải quyết chúng.

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.