N個のコミットがある場合、どうすればn-3コミットから分岐できますか?
すべてのコミットのハッシュを見ることができます。
ハッシュを使ってブランチを作成することができます。
git branch branchname <sha1-of-commit>
あるいは、シンボリックリファレンスを使って:
git branch branchname HEAD~3
作成時にブランチをチェックアウトするには、
git checkout -b branchname <sha1-of-commit or HEAD~3>
Github.comでこれを行うには:
魔法は git reset で行えます。
新しいブランチを作成してそれに切り替えます(だから最新のコミットはすべてここに保存されています)
git checkout -b your_new_branch
以前の作業ブランチに切り替えます(マスターとします)。
git checkout master
最新のx個のコミットを削除し、マスターをクリーンに保つ
git reset --hard HEAD~x # in your case, x = 3
これ以降、最新のxコミットはすべて新しいブランチにのみ存在し、以前の作業中のブランチ(マスター)には存在しなくなります。
どのコミットを前もって分岐させたいのかわからない場合は、コミットをチェックアウトしてそのコードを調べることができます(sourceを参照、コンパイル、テスト)。
git checkout <sha1-of-commit>
分岐したいコミットを見つけたら、通常の方法で分岐を作成するだけで、コミット内から(つまり、最初にマスターに戻ることなく)実行できます。
git checkout -b <branch_name>
git checkout -b <branch-name> <sha1-of-commit>
Eclipseでこれを行うには:
それはあなたのためのローカルブランチを作成します。変更をプッシュするたびに、ブランチはリモートサーバーにプッシュされます。
あなたはStashでそれをすることができます。
これに関連した素晴らしい質問は次のとおりです。gitの--help
オプションを使用して、これをどのように理解しますか。これを試してみましょう:
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.
我々はどこかに着いている!
それでは、gobbledegookの次の行に注目してください。
git branch [--set-upstream | --track | --no-track] [-l] [-f] <branchname> [<start-point>]
これを次のように要約してください。
git branch <branchname> [<start-point>]
そしてやった。
私はそうすることができました:
git branch new_branch_name `git log -n 1 --skip 3 --format=%H`
スキップ値を入力する場所。 0が最新、1が前、2がその前のコミットなど.
単に実行します。
git checkout -b branch-name <commit>
例えば :
git checkout -b import/january-2019 1d0fa4fa9ea961182114b63976482e634a8067b8
パラメータ-b
を指定したcheckout
コマンドは、新しいブランチ _と_ を作成します。
これは私がしたことです:
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
この場合、8a75b001096536b3216022484af3026aa9c7bb5b
はmaster
ブランチに属していた古いコミットでした。
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
とこのブランチはcommitに移動されます。
HEAD
がデタッチ状態にある場合、git resetはHEAD
を移動するだけです。 ブランチをリセットするには、まずそれをチェックしてください。
Git resetとgit checkoutの違いについてもっと知りたいなら、 公式gitブログ を読むことをお勧めします。
ソースツリーを使用する場合は、かなり簡単です。
承認された回答をVisual Studio 2015および2017で実行するには
変更箇所をクリック(上の赤い矢印)
[アクション](上の赤い矢印)をクリックし、[ドロップダウン]メニューの[履歴の表示]をクリックします。
そして新しいタブが開きます。
そして、あなたはあなたのコードをあなたがあなたのコードに戻すことを望むという前のコミットを右クリックするべきです:
新しいブランチをチェックアウトすることを選択してください。
以下は、OP質問の一部ではありませんが、私は両方ともやっていますが、これは少なくとも私にとってはトリックステップです。新しいブランチをチェックアウトせずに前のコミットに戻る場合は、revertを選択しないでください。 ;) --mixedまたは--hardを再定義してください。