Gitを使用して以前のコミットから分岐する


1798

n個のコミットがある場合、n-3コミットから分岐するにはどうすればよいですか?

すべてのコミットのハッシュを見ることができます。

回答:


2547

ハッシュを介してブランチを作成できます:

git branch branchname <sha1-of-commit>

または、シンボリックリファレンスを使用します。

git branch branchname HEAD~3

作成時にブランチをチェックアウトするには、次を使用します

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

42
Git 1.8.2では、最初のフォームに短いsha1を使用できます。
Dan Benamy 2013

53
@MattFenwick Gitを使用すると、リポジトリ内でハッシュが「一意」である限り、ハッシュが許可されているすべての場所でハッシュを使用できます。うまくいかない場合は、ハッシュから別の文字を追加してみてください。
2013年

29
:サーバーに正しく新しいブランチをプッシュする...この最後のステップに必要なgit push origin BRANCH_NAME
ジーンボー

3
<sha1-of-commit>run からブランチを開始するgit checkout -b <name-of-branch> <sha1-of-commit>が、ブランチがすでに存在する場合git checkout -B <name-of-branch> <sha1-of-commit>
mostafazh

258

github.comでこれを行うには:

  1. プロジェクトに移動します。
  2. 「コミット」をクリックします。
  3. ブランチするコミットの<>(「履歴のこの時点でリポジトリを参照」)をクリックします。
  4. 左上の「tree:xxxxxx」をクリックします。言語統計バーのすぐ下に、「ブランチを検索または作成」するオプションがあります(そこに新しいブランチ名を入力するだけです)前のコミットからの分岐

4
問題はgithubについてではなく、gitについてです。ほとんどのgitサーバーはgithubではありません。
Anders Tornblad、2017

46
これはgitではなくGithubであるという事実にもかかわらず、それは非常に役に立ちました!
リズ

残念ながら、それでも他のコミットからの変更が表示されます。これは避けたかったためです。このため、この質問を検索しました
Maxim

83

マジックはgit resetで実行できます。

  1. 新しいブランチを作成してそこに切り替えます(最新のコミットはすべてここに保存されます)

    git checkout -b your_new_branch

  2. 以前の作業ブランチに切り替えます(マスターであると想定)

    git checkout master

  3. 最新のxコミットを削除し、マスターをクリーンに保つ

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

この時点から、最新のxコミットはすべて新しいブランチのみにあり、以前の作業ブランチ(マスター)にはもうありません。


7
これは、マスターからコミットを削除して、それらのコミットが行われる前にブランチを作成することを覚えているかのように作成するため、私が探していたものです。ありがとう。
スーパーベック

7
git reset --hardすでにコミットをオリジンにプッシュしている場合、aは良い考えではないことを忘れないでください...
LuisF

1
git push --force 以前にブランチをプッシュしたことがある場合は、可能です
ミラノ、

--force使用した場合でも、本当に気をつけてblog.developer.atlassian.com/force-with-lease
peater

74

事前に分岐したいコミットがわからない場合は、コミットをチェックアウトして、そのコードを調べることができます(ソースを参照して、コンパイルして、テストします)。

git checkout <sha1-of-commit>

ブランチを作成したいコミットが見つかったら、通常の方法でブランチを作成するだけで、コミット内から(つまり、最初にマスターに戻らずに)実行できます。

git checkout -b <branch_name>

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

1
これは " git branch branchname <sha1-of-commit>"(受け入れられた回答から)とどう違うのですか?
Peter Mortensen

知りません。同等だと思います。私はいつもgit checkout -b新しいブランチを作るのに使います。
タイラーロング

10
stackoverflow.com/a/7987711/3590629 gitブランチ...はブランチを作成しますが、現在のブランチのままです。git checkout -b ...はブランチを作成し、そこに切り替えます。
esme_louise

9

Githubリポジトリでそれを行う簡単な方法は次のとおりです。

  • ブランチから特定のコミットを見つける
  • SHA IDの横にある[履歴のこの時点でリポジトリを参照する]をクリックします
  • ここでは、このコミットから新しいブランチを作成できます ここに画像の説明を入力してください

1
これは実際には古い
regetskcob 2017

2
問題はgithubに関するものではありません。
Anders Tornblad、2017

8

単に実行する:

git checkout -b branch-name <commit>

例えば ​​:

git checkout -b import/january-2019 1d0fa4fa9ea961182114b63976482e634a8067b8

checkoutパラメーターを指定したコマンドは、-b新しいブランチを作成する、それはそれにあなたを切り替えます


1
私はこれがたくさん好きです。おかげで
フール

プルリクエストで削除された機能ブランチのSHAコミットに基づいてブランチを作成することはできますか?または、マスターでのプルリクエストのコミットから分岐する必要がありますか?
user2966445

ランgit fetchgit branchターミナルを使用して、プロジェクトのフォルダ上のコマンドは、その後、機能ブランチが存在する場合、このような場合には[はい、もちろんあなたが削除枝から枝を作成できるように文句を言わない、チェック、あなたはまた、場合には、分岐の削除を元に戻すことができブランチがなくなりました
d1jhoni1b

4

関連する素晴らしい質問は次のとおりです:--helpgit のオプションを使用してこれをどのように理解するのですか?これを試してみましょう:

git branch --help

次の出力が表示されます。

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>]

Gobbledegook。

「commit」という単語を次のテキストで検索します。私たちはこれを見つけます:

   <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.

どこかに着きました!

さて、ゴブルデコックのこの行に注目してください:

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

これを凝縮してください:

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

そして完了。


1
私はgitが嫌いです。ありがとう。
バイロンウィットロック

4

Eclipseでこれを行うには:

  • 「Gitリポジトリ探索」パースペクティブに移動します。
  • 「タグ」を展開し、ブランチを作成するコミットを選択します。
  • コミットを右クリックして、「ブランチの作成」を選択します。
  • ブランチ名を入力します。

ローカルブランチが作成されます。その後、変更をプッシュするたびに、ブランチがリモートサーバーにプッシュされます。


3

あなたはスタッシュでそれを行うことができます。

  1. コミットをクリックします
  2. 画面の右上にある[このコミットにタグを付ける]をクリックします
  3. 次に、作成したタグから新しいブランチを作成できます。

これは何のGUIですか?GitHub?
ostrichofevil

Atlassian Stash
David Ruan

3

私はそうすることができました:

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

スキップ値を入力する必要がある場所。0は最新、1は前、2はその前のコミットなどです。


4
なぜ単に使用しないのHEAD~1ですか(1は1つのコミットバックを指定します)?
jduncanator 2013年

1
あなたの方法は選択した回答でカバーされており、うまく機能します。鉱山は選択した答えとは異なる方法です。
Mike Graf

3

これにより、1つのコマンドでブランチが作成されます。

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

私はこの方法を上に公開した方法よりも優れています。これは、ブランチをすぐに作成するためです(後で追加のプッシュコマンドを必要としないため)。


3

Sourcetreeの使用| 最も簡単な方法。

  • まず、特定のコミットを実行するブランチをチェックアウトして、新しいブランチを作成します。
  • 次に、ツールバーを確認し、[リポジトリ]> [ブランチ]を選択します。ショートカットはCommand + Shift + Bです。
  • そして、実行したい特定のコミットを選択します。そして、新しいブランチ名を付けてブランチを作成してください!

ここに画像の説明を入力してください


最終的にこの有用な答えが見つかりました。ありがとう
Firda Sahidi

1

これは私がやったことです:

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

この場合、8a75b001096536b3216022484af3026aa9c7bb5bwasおよびold commitはmasterブランチに属していました。


1

gitリポジトリの特定のコミットに移動する

gitリポジトリで作業しているときに、特定のコミット(リビジョン)に戻って、特定の時間にプロジェクトのスナップショットを取得したい場合があります。これを行うには、次のコマンドでログを確認することで簡単に確認できるコミットのSHA-1ハッシュが必要です。

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

これにより、すべてのコミットとSHA-1ハッシュの短いバージョンのコンパクトなリストが表示されます。

行きたいコミットのハッシュがわかったので、次の2つのコマンドのいずれかを使用できます。

git checkout HASH

または

git reset --hard HASH

チェックアウト

git checkout <commit> <paths>

パスの現在の状態を、指定されたコミットの状態に置き換えるようにgitに指示します。パスはファイルまたはディレクトリです。

ブランチが指定されていない場合、gitはHEADコミットを想定します。

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

パスが指定されていない場合、gitは指定さHEADれたコミットに移動します(それにより、座って作業しているコミットが変更されます)。

git checkout branch //means switching branches.

リセット

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

ブランチにいる場合(通常はブランチである必要があります)、HEADこのブランチはコミットするように移動されます。

デタッチHEAD状態の場合、git resetは移動のみを行いHEADます。ブランチをリセットするには、まずそれをチェックアウトします。

git resetとgit checkoutの違いについて詳しく知りたい場合は、公式のgitブログを読むことをお勧めします。


2
回答ありがとうございます。git log --abbrev-commit --pretty=oneline git log --oneline
参考

0

コミットを選択

Git GUIユーザーの場合、すべての履歴を視覚化し(必要な場合)、分岐元のコミットを右クリックして分岐名を入力できます。

支店名を入力してください

すべての履歴を視覚化


これは、ユーザーがWindowsやMACなどのUIベースのOSを使用している場合にのみ機能します
Saurabhcdt

そのとおり。私の返信は、具体的には「Git GUIユーザー向け」という言葉で始まります。私は皆のために働く返信を与えていません-それはすでに行われています。私は多くの人にとってもっと簡単かもしれない別の方法を与えました。私の返信が嫌われる理由は、それがすべての人のための解決策ではないためだと思いますが、それはすでに数千の賛成投票で存在しています。しかし、それでも「Git GUIユーザーの場合は!」という返答が間違っているわけではありません。CREATE NEW BRANCHはGUIにあります。私がこれを使用しているのは私だけだと思います。
Ivan

0

Visual Studio 2015&2017で承認された回答を行うには:

クリックして変更

変更箇所をクリックしてください(上の赤い矢印)

アクションをクリックして履歴を表示

[アクション](上の赤い矢印)をクリックし、ドロップダウンメニューの[履歴の表示]をクリックします。

そして新しいタブが開きます:

履歴タブ

そして、コードを元に戻す前のコミットを右クリックする必要があります。 前のコミットを右クリック

新しいブランチをチェックアウトしてボイラを選択してください!

以下では、OPの質問の一部ではありませんが、私は多くのことを行いますが、これは少なくとも私にとってはトリックステップです:新しいブランチをチェックアウトせずに以前のコミットに戻したい場合は、revert(! ?); --mixedまたは--hardの再定義を選択する必要があります。

前のコミットを右クリックして再定義します


ここで私たちのほとんどが英語以外の外国語を話したり、知ったりしていないので、答えを英語で共有してください。
Shamiul Hasan Rumman

@ShamiulHasanRumman、画像の説明テキストに-通常は以下を-私はそのように、英語にレッドアロー尖った用語を翻訳アクションでクリックします(上の赤い矢印)それは十分ではなかったですか?
Marcelo Scofano

@MarceloScofano、スクリーンショットを撮る前に英語でエディターを切り替えるのは大変でしたか?
Andrew Surdu

1
@AndreiSurdu:私はそれをする必要がなかったので、英語に変更するためにいくつかの追加パッケージをインストールする必要があると思っていました。しかし、あなたの言うとおり、VSを再起動するだけで、インストールは必要ありません。時間が空いたらすぐに上の画像を変えてみます。
Marcelo Scofano

0

ソースツリーを使用する場合、それはかなり単純です。

  • 新しいブランチを作成する必要がある場所からコミットを右クリックします
  • 「ブランチ」をクリックします
  • 表示されたダイアログに新しいブランチの名前を入力し、「ブランチの作成」をクリックします

0

コマンドラインベースのソリューションを探している場合は、私の答えを無視できます。GitKrakenを使用することをお勧めします。それは並外れたgit UIクライアントです。ホームページにGitツリーが表示されます。あなたはそれらを見て、プロジェクトで何が起こっているかを知ることができます。特定のコミットを選択して右クリックし、「ここにブランチを作成」オプションを選択するだけです。ブランチ名を入力するためのテキストボックスが表示されます。ブランチ名を入力して「OK」を選択すると、設定が完了します。それは本当に非常に使いやすいです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.