Chi nhánh từ một cam kết trước đó bằng Git


1798

Nếu tôi có n cam kết, làm thế nào tôi có thể phân nhánh từ cam kết n-3?

Tôi có thể thấy hàm băm của mọi cam kết.

Câu trả lời:


2547

Bạn có thể tạo chi nhánh thông qua hàm băm:

git branch branchname <sha1-of-commit>

Hoặc bằng cách sử dụng một tham chiếu tượng trưng:

git branch branchname HEAD~3

Để kiểm tra chi nhánh khi tạo nó, sử dụng

git checkout -b branchname <sha1-of-commit or HEAD~3>

42
Git 1.8.2 cho tôi sử dụng sha1 ngắn cho mẫu đầu tiên.
Dan Benamy

53
@MattFenwick Git sẽ cho phép bạn sử dụng băm rút ngắn ở mọi nơi cho phép băm, miễn là băm rút ngắn là '' duy nhất '' trong kho lưu trữ. Vì vậy, nếu nó không hoạt động, hãy thử thêm một ký tự khác từ hàm băm.
chọc

29
Để đẩy chi nhánh mới chính xác đến máy chủ .. cần bước cuối cùng này:git push origin BRANCH_NAME
Gene Bo

3
để bắt đầu một chi nhánh từ <sha1-of-commit>hoạt động git checkout -b <name-of-branch> <sha1-of-commit>nhưng nếu chi nhánh đã tồn tạigit checkout -B <name-of-branch> <sha1-of-commit>
mostafazh

258

Để làm điều này trên github.com:

  1. Tới dự án của bạn.
  2. Nhấp vào "Cam kết".
  3. Nhấp vào <> ("Duyệt kho lưu trữ tại thời điểm này trong lịch sử") trên cam kết bạn muốn phân nhánh.
  4. Nhấp vào "cây: xxxxxx" ở phía trên bên trái. Ngay bên dưới thanh thống kê ngôn ngữ, bạn sẽ có tùy chọn "Tìm hoặc tạo chi nhánh" (chỉ cần nhập tên chi nhánh mới ở đó)Chi nhánh từ cam kết trước

4
Câu hỏi không phải là về github, mà là về git. Hầu hết các máy chủ git không phải là github.
Anders Tornblad

46
Mặc dù thực tế đây là Github không phải git, nhưng nó vẫn vô cùng hữu ích!
Liz

Thật không may, nó vẫn hiển thị các thay đổi từ các cam kết khác, điều mà tôi muốn tránh, đó là lý do tại sao tôi tìm kiếm câu hỏi này
Maxim

83

Phép thuật có thể được thực hiện bằng cách thiết lập lại git .

  1. Tạo một nhánh mới và chuyển sang nó (vì vậy tất cả các cam kết mới nhất của bạn được lưu trữ ở đây)

    git checkout -b your_new_branch

  2. Quay trở lại chi nhánh làm việc trước đây của bạn (giả sử đó là chủ)

    git checkout master

  3. Xóa các cam kết x mới nhất, giữ sạch chủ

    git reset --hard HEAD~x # in your case, x = 3

Kể từ thời điểm này, tất cả các cam kết x mới nhất chỉ ở trong nhánh mới, không phải trong nhánh làm việc trước đó của bạn (chính) nữa.


7
Đây là những gì tôi đang tìm kiếm vì nó loại bỏ các cam kết từ Master và làm cho nó như thể bạn đã nhớ để tạo chi nhánh trước khi các cam kết đó được thực hiện. Cảm ơn.
tuyệt vời

7
Đừng quên rằng đó git reset --hardkhông phải là một ý tưởng hay nếu bạn đã đẩy cam kết về nguồn gốc ...
LuisF

1
bạn có thể git push --force nếu bạn đã đẩy chi nhánh trước đó
milan

Nhưng hãy thực sự cẩn thận khi sử dụng --force blog.developer.atlassian.com/force-with-lease
peater

74

Nếu bạn không chắc chắn về cam kết nào bạn muốn phân nhánh trước, bạn có thể kiểm tra các cam kết và kiểm tra mã của họ (xem nguồn, biên dịch, kiểm tra) bằng cách

git checkout <sha1-of-commit>

một khi bạn tìm thấy cam kết mà bạn muốn phân nhánh từ bạn có thể thực hiện điều đó từ bên trong cam kết (tức là không cần quay lại chủ trước) chỉ bằng cách tạo một nhánh theo cách thông thường:

git checkout -b <branch_name>

22
git checkout -b <branch-name> <sha1-of-commit>

1
Điều này khác với " git branch branchname <sha1-of-commit>" (từ câu trả lời được chấp nhận) như thế nào?
Peter Mortensen

Tôi không biết. Tôi nghĩ rằng chúng là tương đương. Tôi luôn luôn sử dụng git checkout -bđể tạo ra một chi nhánh mới.
Tyler Long

10
stackoverflow.com/a/7987711/3590629 chi nhánh git ... tạo chi nhánh nhưng để bạn trên chi nhánh hiện tại. git checkout -b ... tạo chi nhánh và chuyển bạn đến nó.
esme_louise

9

Một cách nhanh chóng để làm điều đó trên repo Github của bạn sẽ như sau:

  • Tìm cam kết cụ thể từ chi nhánh của bạn
  • Bên cạnh id SHA, nhấp vào 'Duyệt repo tại thời điểm này trong lịch sử'
  • Tại đây bạn có thể tạo một chi nhánh mới từ cam kết này nhập mô tả hình ảnh ở đây

1
Điều này thực sự đã lỗi thời
regetskcob

2
Câu hỏi không phải là về github.
Anders Tornblad

8

Đơn giản chỉ cần chạy:

git checkout -b branch-name <commit>

Ví dụ :

git checkout -b import/january-2019 1d0fa4fa9ea961182114b63976482e634a8067b8

Các checkoutlệnh với tham số -bsẽ tạo ra một chi nhánh mới nó sẽ chuyển bạn qua với nó


1
Tôi thích cái này rất nhiều. Cảm ơn
The Fool

có thể tạo một nhánh dựa trên cam kết SHA của nhánh tính năng đã bị xóa thông qua yêu cầu kéo không? Hoặc tôi phải phân nhánh từ cam kết của yêu cầu kéo trên master?
dùng2966445

chạy git fetch& git branchlệnh trên thư mục dự án của bạn bằng thiết bị đầu cuối, sau đó kiểm tra xem nhánh tính năng có tồn tại không, nếu đây là trường hợp thì có, tất nhiên bạn sẽ không thể tạo một nhánh từ các nhánh bị xóa, bạn cũng có thể hoàn nguyên việc xóa chi nhánh trong trường hợp chi nhánh đã biến mất
d1jhoni1b

4

Một câu hỏi liên quan tuyệt vời là: Làm thế nào để bạn tìm ra điều này bằng cách sử dụng --helptùy chọn git? Chúng ta hãy cố gắng này:

git branch --help

Chúng tôi thấy đầu ra này:

NAME
       git-branch - List, create, or delete branches    

SYNOPSIS
       git branch [--color[=<when>] | --no-color] [-r | -a]
               [--list] [-v [--abbrev=<length> | --no-abbrev]]
               [--column[=<options>] | --no-column]
               [(--merged | --no-merged | --contains) [<commit>]] [--sort=<key>]
               [--points-at <object>] [<pattern>...]
       git branch [--set-upstream | --track | --no-track] [-l] [-f] <branchname> [<start-point>]
       git branch (--set-upstream-to=<upstream> | -u <upstream>) [<branchname>]
       git branch --unset-upstream [<branchname>]
       git branch (-m | -M) [<oldbranch>] <newbranch>
       git branch (-d | -D) [-r] <branchname>...
       git branch --edit-description [<branchname>]

Cá bống tượng.

Tìm kiếm thông qua văn bản tiếp theo cho từ "cam kết". Chúng tôi tìm thấy điều này:

   <start-point>
       The new branch head will point to this commit. It may be given as a branch name, a
       commit-id, or a tag. If this option is omitted, the current HEAD will be used instead.

Chúng ta đang đến một nơi nào đó!

Bây giờ, tập trung vào dòng này của gobbledegook:

git branch [--set-upstream | --track | --no-track] [-l] [-f] <branchname> [<start-point>]

Cô đọng điều này:

git branch <branchname> [<start-point>]

Và thực hiện.


1
Tôi ghét git. Cảm ơn.
Byron Whitlock

4

Để làm điều này trong Eclipse:

  • Đi đến phối cảnh "Khám phá kho lưu trữ Git".
  • Mở rộng "Thẻ" và chọn cam kết mà bạn muốn tạo chi nhánh.
  • Nhấp chuột phải vào cam kết và chọn "Tạo chi nhánh".
  • Cung cấp một tên chi nhánh.

Nó sẽ tạo ra một chi nhánh địa phương cho bạn. Sau đó, bất cứ khi nào bạn đẩy các thay đổi của mình, chi nhánh của bạn sẽ được đẩy đến máy chủ từ xa.


3

Bạn có thể làm điều đó trong Stash.

  1. Nhấp vào cam kết
  2. Ở phía trên bên phải của màn hình, nhấp vào "Gắn thẻ cam kết này"
  3. Sau đó, bạn có thể tạo chi nhánh mới từ thẻ bạn vừa tạo.

GUI này là gì? GitHub?
đà điểu

Stlassian Stash
David Ruan

3

Tôi đã có thể làm như vậy:

git branch new_branch_name `git log -n 1 --skip 3 --format=%H`

Nơi bạn phải nhập giá trị bỏ qua. 0 là mới nhất, 1 là trước, 2 là cam kết trước đó, v.v.


4
Tại sao không chỉ sử dụng HEAD~1(trong đó 1 chỉ định 1 cam kết trở lại)?
jduncanator

1
Cách của bạn được bao phủ bởi câu trả lời được chọn, và hoạt động tốt. Của tôi là một cách khác với câu trả lời được lựa chọn.
Mike Graf

3

Điều này tạo ra nhánh với một lệnh:

git push origin <sha1-of-commit>:refs/heads/<branch-name>

Tôi thích cách này tốt hơn những cách được công bố ở trên, vì nó tạo ra nhánh ngay lập tức (không yêu cầu thêm lệnh đẩy sau đó).


3

Sử dụng Sourcetree | Cách dễ nhất.

  • Đầu tiên, hãy kiểm tra chi nhánh mà bạn muốn thực hiện cam kết cụ thể để tạo chi nhánh mới.
  • Sau đó nhìn vào thanh công cụ, chọn Kho lưu trữ> Chi nhánh ... phím tắt là Command + Shift + B.
  • Và chọn cam kết cụ thể mà bạn muốn thực hiện. Và đặt tên chi nhánh mới sau đó tạo chi nhánh!

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


cuối cùng đã tìm thấy câu trả lời hữu ích này. Cảm ơn
Firda Sahidi

1

Đây là những gì tôi đã làm:

C:\Users\[path]\build>git checkout -b responsivenavigation 8a75b001096536b3216022484af3026aa9c7bb5b
Switched to a new branch 'responsivenavigation'

C:\Users\jaimemontoya\Dropbox\CuponClub\androidapp\build>git branch
  master
* responsivenavigation

Trong trường hợp này, 8a75b001096536b3216022484af3026aa9c7bb5bđã và cam kết cũ thuộc về masterchi nhánh.


1

Chuyển đến một cam kết cụ thể của kho lưu trữ git

Đôi khi, khi làm việc trên một kho lưu trữ git, bạn muốn quay lại một cam kết cụ thể (sửa đổi) để có một ảnh chụp nhanh dự án của bạn tại một thời điểm cụ thể. Để làm điều đó, tất cả những gì bạn cần là hàm băm SHA-1 của cam kết mà bạn có thể dễ dàng tìm thấy khi kiểm tra nhật ký bằng lệnh:

git log --abbrev-commit --pretty=oneline

sẽ cung cấp cho bạn một danh sách nhỏ gọn tất cả các cam kết và phiên bản ngắn của hàm băm SHA-1.

Bây giờ bạn đã biết hàm băm của cam kết bạn muốn chuyển đến, bạn có thể sử dụng một trong 2 lệnh sau:

git checkout HASH

hoặc là

git reset --hard HASH

Thủ tục thanh toán

git checkout <commit> <paths>

Nói với git để thay thế trạng thái hiện tại của các đường dẫn bằng trạng thái của chúng trong cam kết đã cho. Đường dẫn có thể là tập tin hoặc thư mục.

Nếu không có chi nhánh nào được đưa ra, git sẽ thừa nhận cam kết CHÍNH.

git checkout <path> // restores path from your last commit. It is a 'filesystem-undo'.

Nếu không có đường dẫn nào được đưa ra, git sẽ di chuyển HEADđến cam kết đã cho (từ đó thay đổi cam kết bạn đang ngồi và làm việc).

git checkout branch //means switching branches.

cài lại

git reset <commit> //re-sets the current pointer to the given commit.

Nếu bạn đang ở trên một chi nhánh (bạn nên thường xuyên), HEAD và nhánh này được chuyển sang cam kết.

Nếu bạn ở HEADtrạng thái tách rời , git reset chỉ di chuyển HEAD. Để thiết lập lại một chi nhánh, đầu tiên hãy kiểm tra nó.

Nếu bạn muốn biết thêm về sự khác biệt giữa thiết lập lại git và kiểm tra git, tôi khuyên bạn nên đọc blog git chính thức .


2
cảm ơn câu trả lời của bạn, FYI: This: git log --abbrev-commit --pretty=oneline có thể được viết tắt thànhgit log --oneline
Suhaib

0

Chọn Cam kết

Đối với người dùng GUI Git, bạn có thể hình dung tất cả lịch sử (nếu cần) và sau đó nhấp chuột phải vào cam kết bạn muốn phân nhánh và nhập tên chi nhánh.

Nhập tên chi nhánh

Hình dung tất cả lịch sử


Điều này sẽ chỉ hoạt động nếu người dùng sử dụng bất kỳ HĐH dựa trên giao diện người dùng nào như Windows & MAC
Saurabhcdt

Đúng rồi. Câu trả lời của tôi đặc biệt bắt đầu bằng dòng chữ "Dành cho người dùng GUI Git ...". Tôi đã không đưa ra một câu trả lời sẽ làm việc cho tất cả mọi người - điều đó đã được thực hiện. Tôi đã đưa ra một phương pháp thay thế có thể dễ dàng hơn cho nhiều người. Tôi nghĩ lý do trả lời của tôi không thích là vì nó không phải là giải pháp cho tất cả mọi người, nhưng điều đó đã tồn tại với một vài ngàn lượt upvote. Tuy nhiên, điều đó không làm cho câu trả lời của tôi sai "Đối với người dùng GUI Git!". TẠO CHI NHÁNH MỚI có trong GUI. Tôi nghi ngờ tôi là người duy nhất trên thế giới sử dụng nó!
Ivan

0

Để thực hiện câu trả lời được chấp nhận trong Visual Studio 2015 & 2017:

Nhấp vào thay đổi

Nhấp vào thay đổi (mũi tên màu đỏ ở trên)

Nhấp vào hành động để xem lịch sử

Nhấp vào Hành động (mũi tên màu đỏ ở trên) và nhấp vào Xem Lịch sử trên Menu DropDown

Và Tab mới sẽ mở ra:

Tab lịch sử

Và bạn nên nhấp chuột phải vào cam kết trước đó mà bạn muốn mã của mình trở lại: nhấp chuột phải vào cam kết trước đó

Chọn để kiểm tra một chi nhánh mới và voilá!

Bên dưới, mặc dù không phải là một phần của câu hỏi OP, nhưng tôi làm cả hai và đây là một bước mẹo, ít nhất là với tôi: nếu bạn muốn hoàn nguyên về một cam kết trước đó, mà không kiểm tra một chi nhánh mới, KHÔNG chọn hoàn nguyên (! ?); bạn nên chọn xác định lại - trộn hoặc --hard:

nhấp chuột phải vào cam kết trước đó và xác định lại


Vui lòng chia sẻ câu trả lời của bạn bằng tiếng Anh vì hầu hết chúng ta ở đây không nói hoặc biết bất kỳ ngoại ngữ nào khác ngoài tiếng Anh.
Shamiul Hasan Rumman

@ShamiulHasanRumman, trong văn bản giải thích các hình ảnh - thường là bên dưới - Tôi đã dịch Mũi tên đỏ chỉ sang tiếng Anh, như thế Nhấp vào Hành động (mũi tên đỏ ở trên) Không đủ?
Marcelo Scofano

@MarceloScofano, có khó để chuyển trình chỉnh sửa bằng tiếng Anh trước khi chụp ảnh màn hình không?
Andrew Surdu

1
@AndreiSurdu: vì tôi không bao giờ có nhu cầu làm điều đó, tôi dự kiến ​​rằng để đổi sang tiếng Anh, tôi phải cài đặt thêm một số gói. Nhưng bạn đã đúng, nó chỉ cần khởi động lại VS, không cần cài đặt gì cả. Tôi sẽ cố gắng thay đổi những hình ảnh trên ngay khi tôi có thời gian rảnh.
Marcelo Scofano

0

nếu bạn sử dụng cây nguồn khá dễ dàng.

  • Nhấp chuột phải vào cam kết từ nơi bạn cần tạo chi nhánh mới
  • Nhấp vào 'chi nhánh'
  • Nhập tên của chi nhánh mới trong hộp thoại xuất hiện và nhấp vào 'tạo chi nhánh'

0

Nếu bạn đang tìm kiếm một giải pháp dựa trên dòng lệnh, bạn có thể bỏ qua câu trả lời của tôi. Tôi sẽ đề nghị bạn sử dụng GitKraken . Đó là một máy khách UI git phi thường. Nó hiển thị cây Git trên trang chủ. Bạn chỉ có thể nhìn vào chúng và biết những gì đang xảy ra với dự án. Chỉ cần chọn một cam kết cụ thể, nhấp chuột phải vào nó và chọn tùy chọn 'Tạo chi nhánh tại đây'. Nó sẽ cung cấp cho bạn một hộp văn bản để nhập tên chi nhánh. Nhập tên chi nhánh, chọn 'OK' và bạn đã được đặt. Nó thực sự rất dễ sử dụ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.