Làm cách nào để kéo mã từ kho lưu trữ này sang kho lưu trữ khác?

Chương này thảo luận về việc sao chép hoặc ânhân bảnâ một kho lưu trữ hiện có và sau đó chia sẻ các thay đổi giữa bản gốc và bản sao bằng cách sử dụng các lệnh âpushâ và âpullâ của Git

Lệnh

$ git clone --bare //foo/bar.git refrep
Cloning into 'refrep'...
remote: Counting objects: 21259, done.
remote: Compressing objects: 100% [6730/6730], done.
Receiving objects: 100% [21259/21259], 39.84 MiB | 12…
remote: Total 21259 [delta 15427], reused 20088 [delt…
Resolving deltas: 100% [15427/15427], done.
7 khởi tạo một kho lưu trữ mới với nội dung của một kho lưu trữ khác và thiết lập các nhánh theo dõi trong kho lưu trữ mới để bạn có thể dễ dàng điều phối các thay đổi giữa hai kho lưu trữ bằng cơ chế đẩy/kéo. Chúng tôi gọi kho lưu trữ đầu tiên là âremoteâ [ngay cả khi trên thực tế nó nằm trên cùng một máy chủ] và theo mặc định, điều khiển từ xa này được đặt tên là origin; . Bạn có thể xem và thao tác với điều khiển từ xa bằng
$ git clone --reference refrep //foo/bar.git
Cloning into 'bar'...
done.
0;

Sau khi sao chép kho lưu trữ từ xa, Git kiểm tra nhánh HEAD từ xa [thường là nhánh chính];

$ git clone //nifty-software.org/foo.git
Cloning into 'foo'...
remote: Counting objects: 528, done.
remote: Compressing objects: 100% [425/425], done.
remote: Total 528 [delta 100], reused 528 [delta 100]
Receiving objects: 100% [528/528], 1.31 MiB | 1.30 Mi…
Resolving deltas: 100% [100/100], done.

Nếu bạn đưa ra đối số thứ hai, Git sẽ tạo một thư mục có tên đó cho kho lưu trữ mới [hoặc sử dụng một thư mục hiện có, miễn là nó trống]; . Ví dụ: foo vẫn là foo, nhưng foo. git và bar/foo cũng trở thành foo

Bạn có thể chỉ định kho lưu trữ từ xa bằng một URL như được hiển thị hoặc bằng một đường dẫn đơn giản đến một thư mục trong hệ thống tệp chứa kho lưu trữ Git. Git hỗ trợ một số sơ đồ truyền tải nguyên bản để truy cập các kho lưu trữ từ xa, bao gồm HTTP, HTTPS, giao thức git của riêng nó, FTP, FTPS và rsync

Git cũng sẽ tự động sử dụng SSH nếu bạn sử dụng sơ đồ ssh URL [ssh. //], hoặc đặt kho lưu trữ dưới dạng

$ git clone --reference refrep //foo/bar.git
Cloning into 'bar'...
done.
3; . Nếu đường dẫn là tương đối [không có dấu gạch chéo ở đầu], thì nó thường liên quan đến thư mục chính của tài khoản đăng nhập trên máy chủ, mặc dù điều này phụ thuộc vào cấu hình máy chủ SSH. Bạn có thể chỉ định chương trình SSH để sử dụng với biến môi trường
$ git clone --reference refrep //foo/bar.git
Cloning into 'bar'...
done.
5 [mặc định là, không ngạc nhiên,
$ git clone --reference refrep //foo/bar.git
Cloning into 'bar'...
done.
6]. Với biểu mẫu dài, bạn cũng có thể cung cấp số cổng TCP cho máy chủ, e. g. ,
$ git clone --reference refrep //foo/bar.git
Cloning into 'bar'...
done.
7

Khi bạn cung cấp cho kho lưu trữ gốc dưới dạng một tên thư mục đơn giản và kho lưu trữ mới nằm trên cùng một hệ thống tệp, Git sử dụng Unix âliên kết cứngâ cho các bản gốc cho một số tệp nhất định thay vì sao chép chúng khi điền vào cơ sở dữ liệu đối tượng của bản sao . Điều này là an toàn vì hai lý do. Đầu tiên, ngữ nghĩa của các liên kết cứng là việc ai đó xóa một tệp được chia sẻ trong kho lưu trữ gốc không ảnh hưởng đến bạn; . Thứ hai, do địa chỉ dựa trên nội dung, các đối tượng Git là bất biến; . Bạn có thể tắt tính năng này và bắt buộc sao chép thực tế bằng

$ git clone --reference refrep //foo/bar.git
Cloning into 'bar'...
done.
8 hoặc bằng cách sử dụng URL có sơ đồ âfileâ để truy cập vào cùng một đường dẫn. tập tin. ///đường dẫn/đến/repo. git [tên máy chủ trống giữa dấu gạch chéo thứ hai và thứ ba biểu thị máy chủ cục bộ]

Ghi chú

Khi chúng tôi đề cập đến kho lưu trữ âcục bộâ trong phần này, chúng tôi muốn nói đến một kho lưu trữ có thể truy cập được bằng Git bằng cách sử dụng hệ thống tệp, thay vì cần kết nối mạng rõ ràng [SSH, HTTP, v.v.]. Tuy nhiên, trên thực tế, điều đó có thể không phải là cục bộâ đối với chính máy chủ lưu trữ [có nghĩa là trên phần cứng được gắn trực tiếp vào nó]; . Do đó, một kho lưu trữ là cục bộâ đối với Git vẫn có thể là từ xaâ từ máy chủ lưu trữ

Một phương pháp thậm chí còn nhanh hơn khi nhân bản kho lưu trữ cục bộ là tùy chọn

$ git clone --reference refrep //foo/bar.git
Cloning into 'bar'...
done.
9. Thay vì sao chép hoặc liên kết các tệp giữa kho lưu trữ gốc và bản sao, điều này chỉ đơn giản là định cấu hình bản sao để tìm kiếm cơ sở dữ liệu đối tượng của nguồn gốc ngoài cơ sở dữ liệu của chính nó. Ban đầu, cơ sở dữ liệu đối tượng của bản sao hoàn toàn trống rỗng, bởi vì tất cả các đối tượng mà nó cần đều có trong nguồn gốc. Các đối tượng mới bạn tạo trong bản sao được thêm vào cơ sở dữ liệu của chính nó;

Tuy nhiên, điều quan trọng cần lưu ý là bản sao hiện phụ thuộc vào kho lưu trữ gốc để hoạt động; . Nếu bạn biết mình sắp xóa kho lưu trữ gốc, bạn có thể sử dụng

$ git clone --bare //foo/bar.git refrep
Cloning into 'refrep'...
remote: Counting objects: 21259, done.
remote: Compressing objects: 100% [6730/6730], done.
Receiving objects: 100% [21259/21259], 39.84 MiB | 12…
remote: Total 21259 [delta 15427], reused 20088 [delt…
Resolving deltas: 100% [15427/15427], done.
40 trong bản sao để buộc nó sao chép tất cả các đối tượng nó cần vào cơ sở dữ liệu của chính nó. Nếu bạn phải khôi phục do vô tình xóa nguồn gốc, bạn có thể chỉnh sửa. git/objects/info/alternates nếu bạn có một bản sao cục bộ khác. Bạn cũng có thể thêm kho lưu trữ khác bằng
$ git clone --bare //foo/bar.git refrep
Cloning into 'refrep'...
remote: Counting objects: 21259, done.
remote: Compressing objects: 100% [6730/6730], done.
Receiving objects: 100% [21259/21259], 39.84 MiB | 12…
remote: Total 21259 [delta 15427], reused 20088 [delt…
Resolving deltas: 100% [15427/15427], done.
41, sau đó sử dụng
$ git clone --bare //foo/bar.git refrep
Cloning into 'refrep'...
remote: Counting objects: 21259, done.
remote: Compressing objects: 100% [6730/6730], done.
Receiving objects: 100% [21259/21259], 39.84 MiB | 12…
remote: Total 21259 [delta 15427], reused 20088 [delt…
Resolving deltas: 100% [15427/15427], done.
42
$ git clone --bare //foo/bar.git refrep
Cloning into 'refrep'...
remote: Counting objects: 21259, done.
remote: Compressing objects: 100% [6730/6730], done.
Receiving objects: 100% [21259/21259], 39.84 MiB | 12…
remote: Total 21259 [delta 15427], reused 20088 [delt…
Resolving deltas: 100% [15427/15427], done.
43 để lấy các đối tượng bạn cần

Một vấn đề khác với các bản sao được chia sẻ là bộ sưu tập rác. nếu bộ sưu tập rác sau đó được chạy trên điều khiển từ xa và sau đó nó đã xóa một số tham chiếu mà bạn vẫn có, các đối tượng vẫn là một phần trong lịch sử của bạn có thể biến mất, một lần nữa dẫn đến lỗi “cơ sở dữ liệu bị hỏng” ở phía bạn

Kho lưu trữ âbareâ là kho lưu trữ không có cây hoặc chỉ mục hoạt động, được tạo bởi

$ git clone --bare //foo/bar.git refrep
Cloning into 'refrep'...
remote: Counting objects: 21259, done.
remote: Compressing objects: 100% [6730/6730], done.
Receiving objects: 100% [21259/21259], 39.84 MiB | 12…
remote: Total 21259 [delta 15427], reused 20088 [delt…
Resolving deltas: 100% [15427/15427], done.
44; . thay vào đó, git nằm ngay bên trong thư mục kho lưu trữ. Kho lưu trữ trống thường là điểm điều phối cho quy trình công việc tập trung. mỗi người đẩy và kéo đến và từ bản sao trống, thể hiện trạng thái chính thứcâ hiện tại của dự án. Không ai trực tiếp sử dụng bản sao trống, vì vậy nó không cần cây hoạt động [bạn không thể đẩy vào kho lưu trữ không trống nếu việc đẩy cố cập nhật nhánh đã kiểm xuất hiện tại, vì điều đó sẽ thay đổi nhánh . Một cách sử dụng khác cho kho trống, sử dụng
$ git clone --bare //foo/bar.git refrep
Cloning into 'refrep'...
remote: Counting objects: 21259, done.
remote: Compressing objects: 100% [6730/6730], done.
Receiving objects: 100% [21259/21259], 39.84 MiB | 12…
remote: Total 21259 [delta 15427], reused 20088 [delt…
Resolving deltas: 100% [15427/15427], done.
45, được hiển thị trong phần tiếp theo

Giả sử rằng

  • Bạn muốn kiểm tra nhiều nhánh của cùng một dự án cùng một lúc;
  • Một số người có quyền truy cập vào cùng một hệ thống tệp muốn có bản sao của cùng một kho lưu trữ;
  • Một số quy trình yêu cầu bạn thường xuyên sao chép cùng một kho lưu trữ

…và rằng kho lưu trữ mất nhiều thời gian để sao chép; . Một giải pháp là chia sẻ một bản sao cục bộ của cơ sở dữ liệu đối tượng, thay vì kéo nó lặp đi lặp lại, nhưng việc sử dụng

$ git clone --bare //foo/bar.git refrep
Cloning into 'refrep'...
remote: Counting objects: 21259, done.
remote: Compressing objects: 100% [6730/6730], done.
Receiving objects: 100% [21259/21259], 39.84 MiB | 12…
remote: Total 21259 [delta 15427], reused 20088 [delt…
Resolving deltas: 100% [15427/15427], done.
46 là bất tiện vì nó giới thiệu hai cấp độ đẩy/kéo. bạn đẩy từ bản sao của mình sang bản sao được chia sẻ cục bộ [trần] và sau đó bạn phải đẩy từ đó đến điểm gốc [và tương tự để kéo]

Git có một tùy chọn khác hoàn toàn phù hợp với hóa đơn này. một âkho lưu trữ tài liệu tham khảo. â Đâyâ cách nó hoạt động. trước tiên, chúng tôi tạo một bản sao trần của kho lưu trữ từ xa, để chia sẻ cục bộ dưới dạng kho lưu trữ tham chiếu [do đó được đặt tên là ârefrepâ]

$ git clone --bare //foo/bar.git refrep
Cloning into 'refrep'...
remote: Counting objects: 21259, done.
remote: Compressing objects: 100% [6730/6730], done.
Receiving objects: 100% [21259/21259], 39.84 MiB | 12…
remote: Total 21259 [delta 15427], reused 20088 [delt…
Resolving deltas: 100% [15427/15427], done.

Sau đó, chúng tôi sao chép điều khiển từ xa một lần nữa, nhưng lần này cung cấp giới thiệu dưới dạng tham chiếu

$ git clone --reference refrep //foo/bar.git
Cloning into 'bar'...
done.

Điều này xảy ra rất nhanh và bạn không thấy thông báo nào về việc chuyển các đối tượng vì không cần thiết; . Những người khác sử dụng kho lưu trữ này trong trang web của bạn cũng có thể sử dụng lệnh này để tạo bản sao của họ, chia sẻ tài liệu tham khảo

Điểm khác biệt chính giữa tùy chọn này và tùy chọn

$ git clone --reference refrep //foo/bar.git
Cloning into 'bar'...
done.
9 là bạn vẫn đang theo dõi kho lưu trữ từ xa chứ không phải bản sao refrep. Khi bạn kéo, bạn vẫn liên hệ với http. //foo/, nhưng bạn không cần đợi nó gửi bất kỳ đối tượng nào đã được lưu trữ cục bộ trong refrep;

Tất nhiên, ngay khi bạn và những người khác bắt đầu thực hiện các cam kết mới, kho lưu trữ tham chiếu sẽ trở nên lỗi thời và bạn sẽ bắt đầu mất đi một số lợi ích. Theo định kỳ, bạn có thể chạy

$ git clone --bare //foo/bar.git refrep
Cloning into 'refrep'...
remote: Counting objects: 21259, done.
remote: Compressing objects: 100% [6730/6730], done.
Receiving objects: 100% [21259/21259], 39.84 MiB | 12…
remote: Total 21259 [delta 15427], reused 20088 [delt…
Resolving deltas: 100% [15427/15427], done.
42 trong refrep để lấy bất kỳ đối tượng mới nào. Một kho lưu trữ tham chiếu duy nhất có thể là bộ đệm cho các đối tượng của bất kỳ số nào khác;

$ git clone --bare //foo/bar.git refrep
Cloning into 'refrep'...
remote: Counting objects: 21259, done.
remote: Compressing objects: 100% [6730/6730], done.
Receiving objects: 100% [21259/21259], 39.84 MiB | 12…
remote: Total 21259 [delta 15427], reused 20088 [delt…
Resolving deltas: 100% [15427/15427], done.
4

Cảnh báo

  1. Bạn không thể chạy bộ sưu tập rác một cách an toàn trong kho lưu trữ tài liệu tham khảo. Ai đó đang sử dụng nó có thể vẫn đang sử dụng một nhánh đã bị xóa trong kho lưu trữ ngược dòng hoặc có tham chiếu đến các đối tượng không thể truy cập được ở đó. Bộ sưu tập rác có thể xóa các đối tượng đó và kho lưu trữ của người đó sau đó sẽ gặp sự cố vì hiện tại nó không thể tìm thấy các đối tượng mà nó cần. Một số lệnh Git tự động chạy thu gom rác theo định kỳ, như bảo trì định kỳ. Bạn nên tắt tính năng cắt xén các đối tượng không thể truy cập trong kho lưu trữ tham chiếu với
    $ git clone --bare //foo/bar.git refrep
    Cloning into 'refrep'...
    remote: Counting objects: 21259, done.
    remote: Compressing objects: 100% [6730/6730], done.
    Receiving objects: 100% [21259/21259], 39.84 MiB | 12…
    remote: Total 21259 [delta 15427], reused 20088 [delt…
    Resolving deltas: 100% [15427/15427], done.
    
    49. Điều này vẫn cho phép các hoạt động an toàn khác chạy trong quá trình thu gom rác, chẳng hạn như thu thập các đối tượng được lưu trữ trong các tệp riêng lẻ [âloose objectsâ] thành các cấu trúc dữ liệu hiệu quả hơn được gọi là âpack. • Vì mọi người thường không sử dụng trực tiếp kho lưu trữ tham chiếu và do đó sẽ không kích hoạt bộ sưu tập rác tự động, nên bạn có thể muốn sắp xếp một công việc định kỳ để chạy
    $ git clone --bare //foo/bar.git refrep
    Cloning into 'refrep'...
    remote: Counting objects: 21259, done.
    remote: Compressing objects: 100% [6730/6730], done.
    Receiving objects: 100% [21259/21259], 39.84 MiB | 12…
    remote: Total 21259 [delta 15427], reused 20088 [delt…
    Resolving deltas: 100% [15427/15427], done.
    
    70 trong kho lưu trữ tham chiếu [sau khi đặt
    $ git clone --bare //foo/bar.git refrep
    Cloning into 'refrep'...
    remote: Counting objects: 21259, done.
    remote: Compressing objects: 100% [6730/6730], done.
    Receiving objects: 100% [21259/21259], 39.84 MiB | 12…
    remote: Total 21259 [delta 15427], reused 20088 [delt…
    Resolving deltas: 100% [15427/15427], done.
    
    71 như được hiển thị]
  2. Cẩn thận về bảo mật. Nếu bạn đã hạn chế những người có thể sao chép một kho lưu trữ, nhưng sau đó thêm các đối tượng của nó vào một tham chiếu, thì bất kỳ ai có thể đọc các tệp trong tham chiếu đó đều có thể nhận được thông tin tương tự

Chi nhánh cục bộ, từ xa và theo dõi

Khi bạn sao chép một kho lưu trữ, Git sẽ thiết lập các nhánh theo dõi từ xaâ tương ứng với các nhánh trong kho lưu trữ gốc. Đây là các nhánh trong kho lưu trữ cục bộ của bạn, hiển thị cho bạn trạng thái của các nhánh gốc tại thời điểm đẩy hoặc kéo cuối cùng của bạn. Khi bạn kiểm tra một nhánh chưa tồn tại, nhưng có một nhánh theo dõi từ xa có tên đó, Git sẽ tự động tạo nhánh đó và đặt ngược dòng của nó thành nhánh theo dõi đó, để các thao tác đẩy/kéo tiếp theo sẽ đồng bộ hóa của bạn. . Ví dụ: khi bạn sao chép một kho lưu trữ lần đầu tiên, Git sẽ kiểm tra nhánh HEAD của điều khiển từ xa, vì vậy điều này xảy ra ngay lập tức đối với một nhánh

$ git clone --bare //foo/bar.git refrep
Cloning into 'refrep'...
remote: Counting objects: 21259, done.
remote: Compressing objects: 100% [6730/6730], done.
Receiving objects: 100% [21259/21259], 39.84 MiB | 12…
remote: Total 21259 [delta 15427], reused 20088 [delt…
Resolving deltas: 100% [15427/15427], done.
7

Để bắt đầu, các nhánh theo dõi cục bộ và theo dõi từ xa của bạn dành cho chủ có cùng một cam kết

$ git clone --reference refrep //foo/bar.git
Cloning into 'bar'...
done.
0

Nếu bạn thêm một cam kết, bạn sẽ thấy chi nhánh của mình vượt lên phía trước

$ git clone --reference refrep //foo/bar.git
Cloning into 'bar'...
done.
1

Nếu bạn chạy

$ git clone --bare //foo/bar.git refrep
Cloning into 'refrep'...
remote: Counting objects: 21259, done.
remote: Compressing objects: 100% [6730/6730], done.
Receiving objects: 100% [21259/21259], 39.84 MiB | 12…
remote: Total 21259 [delta 15427], reused 20088 [delt…
Resolving deltas: 100% [15427/15427], done.
72, bạn có thể thấy rằng ai đó cũng đã thêm một cam kết và các nhánh hiện đã chuyển hướng

$ git clone --reference refrep //foo/bar.git
Cloning into 'bar'...
done.
3

$ git clone --bare //foo/bar.git refrep
Cloning into 'refrep'...
remote: Counting objects: 21259, done.
remote: Compressing objects: 100% [6730/6730], done.
Receiving objects: 100% [21259/21259], 39.84 MiB | 12…
remote: Total 21259 [delta 15427], reused 20088 [delt…
Resolving deltas: 100% [15427/15427], done.
73 sẽ cố gắng hợp nhất các nhánh hiện đã khác biệt, điều này là cần thiết trước khi bạn có thể đẩy các thay đổi của mình;

đồng bộ hóa. Đẩy và kéo

Sau khi nhân bản một kho lưu trữ, bạn sử dụng

$ git clone --bare //foo/bar.git refrep
Cloning into 'refrep'...
remote: Counting objects: 21259, done.
remote: Compressing objects: 100% [6730/6730], done.
Receiving objects: 100% [21259/21259], 39.84 MiB | 12…
remote: Total 21259 [delta 15427], reused 20088 [delt…
Resolving deltas: 100% [15427/15427], done.
74 và
$ git clone --bare //foo/bar.git refrep
Cloning into 'refrep'...
remote: Counting objects: 21259, done.
remote: Compressing objects: 100% [6730/6730], done.
Receiving objects: 100% [21259/21259], 39.84 MiB | 12…
remote: Total 21259 [delta 15427], reused 20088 [delt…
Resolving deltas: 100% [15427/15427], done.
73 để đối chiếu các thay đổi của mình với những thay đổi của những người khác sử dụng cùng một kho lưu trữ ngược dòng. Nhiều điều có thể xảy ra khi thay đổi của bạn xung đột với thay đổi của họ;

Nếu một nhánh foo đang theo dõi một nhánh trong kho lưu trữ từ xa, thì điều khiển từ xa đó được định cấu hình là

$ git clone --bare //foo/bar.git refrep
Cloning into 'refrep'...
remote: Counting objects: 21259, done.
remote: Compressing objects: 100% [6730/6730], done.
Receiving objects: 100% [21259/21259], 39.84 MiB | 12…
remote: Total 21259 [delta 15427], reused 20088 [delt…
Resolving deltas: 100% [15427/15427], done.
77 trong kho lưu trữ này và được cho là điều khiển từ xa được liên kết với nhánh này hoặc chỉ âtừ xa của nhánh này. â
$ git clone --bare //foo/bar.git refrep
Cloning into 'refrep'...
remote: Counting objects: 21259, done.
remote: Compressing objects: 100% [6730/6730], done.
Receiving objects: 100% [21259/21259], 39.84 MiB | 12…
remote: Total 21259 [delta 15427], reused 20088 [delt…
Resolving deltas: 100% [15427/15427], done.
73 cập nhật các nhánh theo dõi của điều khiển từ xa cho nhánh hiện tại [hoặc của điều khiển từ xa
$ git clone --bare //foo/bar.git refrep
Cloning into 'refrep'...
remote: Counting objects: 21259, done.
remote: Compressing objects: 100% [6730/6730], done.
Receiving objects: 100% [21259/21259], 39.84 MiB | 12…
remote: Total 21259 [delta 15427], reused 20088 [delt…
Resolving deltas: 100% [15427/15427], done.
79 nếu nhánh không có], tìm nạp các đối tượng mới khi cần và ghi lại các nhánh ngược dòng mới. Nếu nhánh hiện tại đang theo dõi ngược dòng trong điều khiển từ xa đó, thì Git sẽ cố gắng điều hòa trạng thái hiện tại của nhánh của bạn với trạng thái của nhánh theo dõi mới được cập nhật. Nếu chỉ bạn hoặc thượng nguồn đã thêm các cam kết vào nhánh này kể từ lần kéo cuối cùng của bạn, thì điều này sẽ thành công với bản cập nhật fast-forwardâ. một đầu nhánh chỉ di chuyển về phía trước dọc theo nhánh để bắt kịp nhánh kia. Tuy nhiên, nếu cả hai bên đã thêm các cam kết, thì không thể cập nhật nhanh về phía trước. chỉ cần đặt đầu nhánh của một bên khớp với đầu kia sẽ loại bỏ các xác nhận mới của phía đối diện [chúng sẽ không thể truy cập được từ đầu mới]. Đây là tình huống được hiển thị trước đây và giải pháp là hợp nhất

$ git clone --reference refrep //foo/bar.git
Cloning into 'bar'...
done.
1

Cam kết hợp nhất 2ee20b94 tập hợp các phiên bản ngược dòng và cục bộ khác nhau của nhánh, đồng thời cho phép cả chủ và gốc/chủ tiến tới cùng một cam kết mà không làm mất thông tin.

$ git clone --bare //foo/bar.git refrep
Cloning into 'refrep'...
remote: Counting objects: 21259, done.
remote: Compressing objects: 100% [6730/6730], done.
Receiving objects: 100% [21259/21259], 39.84 MiB | 12…
remote: Total 21259 [delta 15427], reused 20088 [delt…
Resolving deltas: 100% [15427/15427], done.
73 sẽ tự động thử điều này và nếu nó có thể kết hợp các thay đổi thực tế một cách rõ ràng, thì tất cả điều này sẽ diễn ra suôn sẻ. Nếu không, Git sẽ dừng lại và yêu cầu bạn xử lý xung đột trước khi thực hiện cam kết hợp nhất;

$ git clone --bare //foo/bar.git refrep
Cloning into 'refrep'...
remote: Counting objects: 21259, done.
remote: Compressing objects: 100% [6730/6730], done.
Receiving objects: 100% [21259/21259], 39.84 MiB | 12…
remote: Total 21259 [delta 15427], reused 20088 [delt…
Resolving deltas: 100% [15427/15427], done.
74 là đảo ngược của
$ git clone --bare //foo/bar.git refrep
Cloning into 'refrep'...
remote: Counting objects: 21259, done.
remote: Compressing objects: 100% [6730/6730], done.
Receiving objects: 100% [21259/21259], 39.84 MiB | 12…
remote: Total 21259 [delta 15427], reused 20088 [delt…
Resolving deltas: 100% [15427/15427], done.
73, với nó bạn áp dụng các thay đổi của mình cho kho lưu trữ ngược dòng. Nếu, như trước đây, lịch sử của bạn khác với lịch sử của điều khiển từ xa, Git sẽ từ chối đẩy trừ khi bạn giải quyết sự khác biệt mà bạn thực hiện bằng cách kéo trước [như Git nhắc nhở bạn một cách hữu ích]

$ git clone --reference refrep //foo/bar.git
Cloning into 'bar'...
done.
5

Khi bạn kéo và giải quyết mọi xung đột, bạn có thể đẩy lại thành công. Mục tiêu của kéo đối với đẩy là tích hợp các thay đổi ngược dòng với chính bạn để bạn có thể đẩy mà không loại bỏ bất kỳ cam kết nào trong lịch sử ngược dòng. Bạn có thể thực hiện điều đó bằng cách hợp nhất như được hiển thị trước đó hoặc bằng cách ârebasingâ [xem Kéo bằng Rebase]

Nếu bạn đã thêm một chi nhánh địa phương của riêng mình và muốn bắt đầu chia sẻ nó với những người khác, hãy sử dụng tùy chọn

$ git clone --reference refrep //foo/bar.git
Cloning into 'bar'...
done.
03 để Git thêm chi nhánh của bạn vào điều khiển từ xa và thiết lập theo dõi cho chi nhánh địa phương của bạn theo cách thông thường, chẳng hạn

$ git clone --bare //foo/bar.git refrep
Cloning into 'refrep'...
remote: Counting objects: 21259, done.
remote: Compressing objects: 100% [6730/6730], done.
Receiving objects: 100% [21259/21259], 39.84 MiB | 12…
remote: Total 21259 [delta 15427], reused 20088 [delt…
Resolving deltas: 100% [15427/15427], done.
0

Sau thiết lập ban đầu này, bạn chỉ có thể sử dụng

$ git clone --bare //foo/bar.git refrep
Cloning into 'refrep'...
remote: Counting objects: 21259, done.
remote: Compressing objects: 100% [6730/6730], done.
Receiving objects: 100% [21259/21259], 39.84 MiB | 12…
remote: Total 21259 [delta 15427], reused 20088 [delt…
Resolving deltas: 100% [15427/15427], done.
74 trên nhánh này, không có tùy chọn hoặc đối số nào, để đẩy tới cùng một điều khiển từ xa

Có một số cách tiếp cận mà Git có thể sử dụng khi không có điều khiển từ xa cụ thể và giới thiệu để đẩy [chỉ đơn giản là

$ git clone --bare //foo/bar.git refrep
Cloning into 'refrep'...
remote: Counting objects: 21259, done.
remote: Compressing objects: 100% [6730/6730], done.
Receiving objects: 100% [21259/21259], 39.84 MiB | 12…
remote: Total 21259 [delta 15427], reused 20088 [delt…
Resolving deltas: 100% [15427/15427], done.
74, trái ngược với
$ git clone --reference refrep //foo/bar.git
Cloning into 'bar'...
done.
06]

$ git clone --reference refrep //foo/bar.git
Cloning into 'bar'...
done.
07Đẩy tất cả các nhánh có tên cục bộ và tên từ xa khớp nhau
$ git clone --reference refrep //foo/bar.git
Cloning into 'bar'...
done.
08Đẩy nhánh hiện tại lên thượng nguồn của nó [thực hiện các thao tác đẩy và kéo đối xứng]
$ git clone --reference refrep //foo/bar.git
Cloning into 'bar'...
done.
09Giống như
$ git clone --reference refrep //foo/bar.git
Cloning into 'bar'...
done.
08, nhưng kiểm tra xem tên nhánh có giống nhau không [để đề phòng cài đặt ngược dòng nhầm]
$ git clone --reference refrep //foo/bar.git
Cloning into 'bar'...
done.
11Đẩy nhánh hiện tại tới điều khiển từ xa

Bạn có thể thiết lập điều này với biến cấu hình

$ git clone --reference refrep //foo/bar.git
Cloning into 'bar'...
done.
13. Mặc định khi viết bài này là
$ git clone --reference refrep //foo/bar.git
Cloning into 'bar'...
done.
07, nhưng với Git 2. 0, điều này sẽ thay đổi thành
$ git clone --reference refrep //foo/bar.git
Cloning into 'bar'...
done.
09, điều này thận trọng hơn và tránh việc vô tình đẩy các thay đổi lên các nhánh khác chưa sẵn sàng để xuất bản. Để chọn một tùy chọn, hãy nghĩ xem điều gì sẽ xảy ra trong tình huống cụ thể của bạn nếu bạn vô tình gõ
$ git clone --bare //foo/bar.git refrep
Cloning into 'refrep'...
remote: Counting objects: 21259, done.
remote: Compressing objects: 100% [6730/6730], done.
Receiving objects: 100% [21259/21259], 39.84 MiB | 12…
remote: Total 21259 [delta 15427], reused 20088 [delt…
Resolving deltas: 100% [15427/15427], done.
74 khi mỗi tùy chọn này đều có hiệu lực và chọn tùy chọn khiến bạn thấy thoải mái nhất. Hãy nhớ rằng giống như tất cả các tùy chọn, bạn có thể đặt tùy chọn này trên cơ sở từng kho lưu trữ [xem Cấu hình cơ bản]

Cùng với cơ sở của các cam kết hợp nhất, cần phải thực hiện chúng một cách khôn ngoan. Khái niệm về việc hợp nhất nên chỉ ra điều gì liên quan đến nội dung là chủ quan và khác nhau tùy theo nguyên tắc và phong cách kiểm soát phiên bản, nhưng nói chung, bạn muốn hợp nhất để chỉ ra sự kết hợp thực chất của hai dòng phát triển. Chắc chắn, quá nhiều hợp nhất sẽ tạo ra một biểu đồ cam kết khó đọc, do đó làm giảm tính hữu ích của chính tính năng hợp nhất cấu trúc. Trong ngữ cảnh này, một số quy trình công việc nhất định có thể dễ dàng tạo ra cái mà người ta có thể gọi là âsự hợp nhất giả mạoâ không thực sự tương ứng với sự hợp nhất nội dung đó. Có rất nhiều trong số này làm lộn xộn biểu đồ cam kết và gây khó khăn cho việc phân biệt lịch sử thực sự của một dự án

như một ví dụ. giả sử bạn và một đồng nghiệp đang điều phối các kho lưu trữ cá nhân của bạn thông qua đẩy/kéo với kho lưu trữ trung tâm được chia sẻ. Bạn thực hiện một thay đổi đối với kho lưu trữ của mình, trong khi anh ta thực hiện một thay đổi không liên quan trên cùng một nhánh. Các thay đổi có thể đối với các tệp khác nhau hoặc thậm chí đối với cùng một tệp nhưng sao cho chúng không yêu cầu giải quyết xung đột thủ công. Nếu anh ta đẩy trước, thì như đã mô tả trước đó, lần đẩy tiếp theo của bạn sẽ không thành công, vì vậy bạn sẽ kéo; . Nhưng nếu bạn coi việc hợp nhất là một bước có chủ ý để báo hiệu sự kết hợp của nội dung mâu thuẫn hoặc khác biệt đáng kể, thì bạn không thực sự muốn sự hợp nhất này. Dấu hiệu nhận biết của loại hợp nhất giả mạo này là nó hoàn toàn là một sự tạo tác của thời gian;

  1. Bạn cam kết và đẩy
  2. Anh ấy kéo
  3. Anh ấy cam kết và thúc đẩy

thì sẽ không có xung đột và không có sự hợp nhất. Quan sát này là chìa khóa để tránh những sự hợp nhất như vậy bằng cách sử dụng

$ git clone --bare //foo/bar.git refrep
Cloning into 'refrep'...
remote: Counting objects: 21259, done.
remote: Compressing objects: 100% [6730/6730], done.
Receiving objects: 100% [21259/21259], 39.84 MiB | 12…
remote: Total 21259 [delta 15427], reused 20088 [delt…
Resolving deltas: 100% [15427/15427], done.
73
$ git clone --reference refrep //foo/bar.git
Cloning into 'bar'...
done.
18, sắp xếp lại các thay đổi của bạn. âRebasingâ là một ý tưởng tổng quát hơn mà chúng tôi xử lý trong Rebasing; . Tóm lại, chuyện xảy ra là thế này. giả sử nhánh chính của bạn chuyển hướng từ thượng nguồn của nó, một số lần xác nhận trở lại. Đối với mỗi cam kết khác nhau trên nhánh của bạn, Git xây dựng một bản vá đại diện cho những thay đổi được đưa ra bởi cam kết đó; . Sau khi áp dụng mỗi bản vá, Git thực hiện một cam kết mới bảo toàn thông tin tác giả và thông báo từ cam kết ban đầu. Cuối cùng, nó đặt lại nhánh chính của bạn để trỏ đến lần xác nhận cuối cùng trong số này. Hiệu quả là “phát lại” công việc của bạn trên nhánh ngược dòng dưới dạng các cam kết mới, thay vì ảnh hưởng đến việc hợp nhất với hiện tại của bạn. cam kết

Trong ví dụ trước đó,

$ git clone --reference refrep //foo/bar.git
Cloning into 'bar'...
done.
19 sẽ tạo ra lịch sử tuyến tính, đơn giản sau thay vì âmerge bong bóngâ được mô tả trước đó, với cam kết bổ sung của nó

$ git clone --bare //foo/bar.git refrep
Cloning into 'refrep'...
remote: Counting objects: 21259, done.
remote: Compressing objects: 100% [6730/6730], done.
Receiving objects: 100% [21259/21259], 39.84 MiB | 12…
remote: Total 21259 [delta 15427], reused 20088 [delt…
Resolving deltas: 100% [15427/15427], done.
1

Một lần đẩy bây giờ sẽ thành công mà không cần thực hiện thêm [và không cần hợp nhất], bởi vì bạn chỉ cần thêm vào nhánh ngược dòng; . Lưu ý rằng ID cam kết cho từ cuối cùngâ đã thay đổi;

Nếu

$ git clone --bare //foo/bar.git refrep
Cloning into 'refrep'...
remote: Counting objects: 21259, done.
remote: Compressing objects: 100% [6730/6730], done.
Receiving objects: 100% [21259/21259], 39.84 MiB | 12…
remote: Total 21259 [delta 15427], reused 20088 [delt…
Resolving deltas: 100% [15427/15427], done.
73 bắt đầu hợp nhất khi bạn biết rằng không cần thiết, bạn luôn có thể hủy nó bằng cách đưa ra một thông báo cam kết trống hoặc với
$ git clone --reference refrep //foo/bar.git
Cloning into 'bar'...
done.
31 nếu việc hợp nhất không thành công khiến bạn ở chế độ giải quyết xung đột. Nếu bạn hoàn thành việc hợp nhất như vậy và muốn hoàn tác, hãy sử dụng
$ git clone --reference refrep //foo/bar.git
Cloning into 'bar'...
done.
32 để di chuyển nhánh của bạn trở lại, loại bỏ cam kết hợp nhất. Sau đó, bạn có thể sử dụng
$ git clone --bare //foo/bar.git refrep
Cloning into 'refrep'...
remote: Counting objects: 21259, done.
remote: Compressing objects: 100% [6730/6730], done.
Receiving objects: 100% [21259/21259], 39.84 MiB | 12…
remote: Total 21259 [delta 15427], reused 20088 [delt…
Resolving deltas: 100% [15427/15427], done.
73
$ git clone --reference refrep //foo/bar.git
Cloning into 'bar'...
done.
18 để thay thế. Bạn có thể đặt một nhánh cụ thể để tự động sử dụng
$ git clone --reference refrep //foo/bar.git
Cloning into 'bar'...
done.
18 khi kéo

$ git clone --bare //foo/bar.git refrep
Cloning into 'refrep'...
remote: Counting objects: 21259, done.
remote: Compressing objects: 100% [6730/6730], done.
Receiving objects: 100% [21259/21259], 39.84 MiB | 12…
remote: Total 21259 [delta 15427], reused 20088 [delt…
Resolving deltas: 100% [15427/15427], done.
2

và biến cấu hình

$ git clone --reference refrep //foo/bar.git
Cloning into 'bar'...
done.
36 kiểm soát cách cài đặt này cho các nhánh mới

$ git clone --reference refrep //foo/bar.git
Cloning into 'bar'...
done.
37Mặc định. không đặt rebase
$ git clone --bare //foo/bar.git refrep
Cloning into 'refrep'...
remote: Counting objects: 21259, done.
remote: Compressing objects: 100% [6730/6730], done.
Receiving objects: 100% [21259/21259], 39.84 MiB | 12…
remote: Total 21259 [delta 15427], reused 20088 [delt…
Resolving deltas: 100% [15427/15427], done.
43Đặt cho các nhánh theo dõi các nhánh từ xa
$ git clone --reference refrep //foo/bar.git
Cloning into 'bar'...
done.
39Đặt cho các nhánh theo dõi các nhánh khác trong cùng kho lưu trữ
$ git clone --reference refrep //foo/bar.git
Cloning into 'bar'...
done.
10Đặt cho tất cả các nhánh theo dõi

  1. Nếu bạn biết đó là điều đúng đắn cần làm, bạn có thể thực hiện các bản cập nhật phá hoại, không chuyển tiếp nhanh với tùy chọn

    $ git clone --reference refrep //foo/bar.git
    Cloning into 'bar'...
    done.
    11 để đẩy hoặc kéo, mặc dù trong trường hợp đẩy, điều khiển từ xa phải được định cấu hình để cho phép nó;

    coi chừng. Kéo cưỡng bức là một chuyện; . Mặt khác, một cú đẩy cưỡng bức sẽ gây ra sự đau buồn cho những người khác, kết quả là họ sẽ không thể kéo một cách sạch sẽ. Đối với kho lưu trữ được chia sẻ bởi một nhóm nhỏ những người có quan hệ thân thiết hoặc đó là tài liệu tham khảo chỉ đọc đối với hầu hết mọi người, điều này đôi khi có thể phù hợp. Tuy nhiên, đối với bất kỳ nội dung nào được chia sẻ bởi nhiều đối tượng, bạn thực sự không muốn làm điều này

  2. Lệnh

    $ git clone --reference refrep //foo/bar.git
    Cloning into 'bar'...
    done.
    8 đưa ra một bản tóm tắt hữu ích về trạng thái kho lưu trữ của bạn liên quan đến điều khiển từ xa

    $ git clone --bare //foo/bar.git refrep
    Cloning into 'refrep'...
    remote: Counting objects: 21259, done.
    remote: Compressing objects: 100% [6730/6730], done.
    Receiving objects: 100% [21259/21259], 39.84 MiB | 12…
    remote: Total 21259 [delta 15427], reused 20088 [delt…
    Resolving deltas: 100% [15427/15427], done.
    
    3

    Lưu ý rằng không giống như hầu hết các lệnh thông tin, lệnh này thực sự kiểm tra kho lưu trữ từ xa, vì vậy nó sẽ chạy ssh hoặc sử dụng mạng nếu cần. Bạn có thể sử dụng công tắc

    $ git clone --reference refrep //foo/bar.git
    Cloning into 'bar'...
    done.
    2 để tránh điều này;

  3. $ git clone --reference refrep //foo/bar.git
    Cloning into 'bar'...
    done.
    16 đưa ra một bản tóm tắt ngắn gọn hơn mà không cần liên hệ với điều khiển từ xa [và do đó phản ánh trạng thái kể từ lần tìm nạp hoặc kéo cuối cùng; hãy nhớ rằng điều khiển từ xa có thể đã thay đổi trong thời gian chờ đợi]. Phần sau đây cho thấy một nhánh chính hoàn toàn cục bộ, cộng với hai nhánh theo dõi các nhánh từ xa. alvin được cập nhật liên quan đến ngược dòng của nó, trong khi chi nhánh địa phương hiện tại, simon, đã chuyển ba lần xác nhận về phía trước

    $ git clone --bare //foo/bar.git refrep
    Cloning into 'refrep'...
    remote: Counting objects: 21259, done.
    remote: Compressing objects: 100% [6730/6730], done.
    Receiving objects: 100% [21259/21259], 39.84 MiB | 12…
    remote: Total 21259 [delta 15427], reused 20088 [delt…
    Resolving deltas: 100% [15427/15427], done.
    
    4

    [Trạng thái này không phải là kết quả từ các ví dụ trước. ]

  4. Dường như có rất nhiều điều dư thừa vô nghĩa trong nhiều thông báo này; . â Lý do là tình huống phổ biến, mặc định là các nhánh từ xa và cục bộ tương ứng có tên trùng khớp, nhưng điều này không nhất thiết phải như vậy; . Ví dụ: nếu bạn có một kho lưu trữ với hai điều khiển từ xa, mỗi điều khiển có một nhánh chính, thì các nhánh theo dõi cục bộ của bạn cũng không thể được đặt tên là chính. Bạn có thể tiến hành theo cách này

    $ git clone --bare //foo/bar.git refrep
    Cloning into 'refrep'...
    remote: Counting objects: 21259, done.
    remote: Compressing objects: 100% [6730/6730], done.
    Receiving objects: 100% [21259/21259], 39.84 MiB | 12…
    remote: Total 21259 [delta 15427], reused 20088 [delt…
    Resolving deltas: 100% [15427/15427], done.
    
    5

    Những tin nhắn từ

    $ git clone --bare //foo/bar.git refrep
    Cloning into 'refrep'...
    remote: Counting objects: 21259, done.
    remote: Compressing objects: 100% [6730/6730], done.
    Receiving objects: 100% [21259/21259], 39.84 MiB | 12…
    remote: Total 21259 [delta 15427], reused 20088 [delt…
    Resolving deltas: 100% [15427/15427], done.
    
    7

    $ git clone --bare //foo/bar.git refrep
    Cloning into 'refrep'...
    remote: Counting objects: 21259, done.
    remote: Compressing objects: 100% [6730/6730], done.
    Receiving objects: 100% [21259/21259], 39.84 MiB | 12…
    remote: Total 21259 [delta 15427], reused 20088 [delt…
    Resolving deltas: 100% [15427/15427], done.
    
    6

    có thể hơi khó hiểu;

Trong một từ [hoặc ba]. chẳng có ai

Điều quan trọng là phải hiểu rằng bản thân Git không cung cấp bất kỳ loại xác thực hoặc kiểm soát truy cập toàn diện nào khi truy cập kho lưu trữ từ xa. Git không có khái niệm nội bộ về âuserâ hoặc âaccount,â và mặc dù một số hành động cụ thể có thể bị cấm theo cấu hình [e. g. , cập nhật không phải “chuyển tiếp nhanh”, nói chung, bạn có thể làm bất cứ điều gì có thể với các biện pháp kiểm soát truy cập cấp hệ điều hành tại chỗ. Ví dụ: các kho lưu trữ từ xa thường được truy cập thông qua SSH. Điều này thường có nghĩa là bạn cần có thể đăng nhập vào một tài khoản trên máy từ xa [tài khoản này có thể được chia sẻ với người khác]; . Thay vào đó, nếu bạn đang sử dụng HTTP để truy cập, thì các nhận xét tương tự sẽ áp dụng cho cấu hình của máy chủ web và tài khoản mà theo đó nó truy cập vào kho lưu trữ. Đó là nó. Không có cách nào trong Git để giới hạn quyền truy cập cho những người dùng cụ thể theo các khái niệm chi tiết hơn, chẳng hạn như cấp quyền truy cập chỉ đọc cho một nhánh, ủy quyền truy cập cho người khác và không có quyền truy cập vào nhánh thứ ba. Tuy nhiên, có những công cụ của bên thứ ba bổ sung các tính năng như vậy;

Chủ Đề