81

Git についての初心者の質問があります。

ブランチの履歴を前後に移動する必要があります。つまり、すべてのファイルを古いリビジョンの状態に戻してから、リポジトリ内の最新の状態に戻す必要があります。コミットする必要はありません。

SVN では、次のようになります。

svn up -r800

リビジョン 800 に到達し、

svn up

リポジトリと同期します。

戻したいコミットのハッシュはわかっているので、やってみました

git reset <hash>

それは私をそこに連れて行くようです。しかし、私は試しました

git pull

しかし、それは競合について不平を言います。

では、ブランチの履歴を移動する適切な方法は何でしょうか?

私は SVN の観点から考えているので、ためらわずに素敵なチュートリアルを教えてください。私はすでにhttp://git.or.cz/course/svn.htmlhttp://www.youtube.com/watch?v=8dhZ9BXQgc4をチェックしたことに注意してください。

ありがとう、オンドラ。

4

5 に答える 5

73

ええと、私も以前のsvnユーザーであり、今ではすべてのプロジェクトにgitを使用しています。

gitを使用する場合は、svnで使用されているクライアントサーバーアーキテクチャから考え方を変更する必要があります。svnでは、すべての変更にはサーバーとの接続が必要です。gitを使用すると、リポジトリは作業ディレクトリにあります。すべてのリポジトリアクションに接続する必要はありません。

git pushとを使用git pullしてリポジトリと同期するだけです。2つの場所にまったく同じコンテンツを含めるために、rsyncまたは任意のバックアップソリューションを使用するようなものと考えてください。外部バックアップハードディスクを接続するのと同じように、その中のコンテンツをメインのコンテンツと同じにします。それがgit pullとの使用法ですgit push

履歴を行き来したいだけの場合は、を使用して実行しgit checkoutます。を使用してリビジョンIDを参照してくださいgit history。Linuxを使用gitkしている場合は、を使用してリビジョンツリーを確認してください。Windowsでは、tortoisegitはリビジョングラフを使用して表示できます。

最新のリビジョンに戻すには、を使用しますgit checkout master。コマンドを実行する前に、必ず自分で実行してくださいgit status。このコマンドは、現在のリポジトリの状態について知っておく必要のあることと、それを正しくするために実行する必要のあるアクションを表示します。dogit pullとの前に、結果にテキストが含まれgit pushていることを確認することをお勧めします。git statusworking directory clean

ファイルを以前のリビジョンに戻す必要がある場合は、を使用して行うことができますgit merge。ファイルに対して行う前に、まず。でテストしてgit diffください。例:git diff rev1:rev2 filename。2つのリビジョン間で異なるものを出力します。rev1での変更は、rev2での変更に置き換えられます。したがって、元に戻すには、rev2がrev1よりも古くなります。diffの結果に満足したら、で実行し、git mergeで置き換えます。他のすべてのパラメーターは同じままです。diffmerge

これがお役に立てば幸いです。主な鍵は、作業ディレクトリがリポジトリであることを確認することです。これを理解すると、gitを最大限に活用するのに役立ちます。幸運を。

于 2010-01-22T23:43:44.470 に答える
42

を使用git checkoutして任意のコミットをチェックアウトし、それをブランチ名とともに使用して、名前付きブランチに戻ることができます。

git checkoutブランチ名ではなくコミット ID を使用すると、名前付きブランチから離れて、分離されたヘッドと呼ばれるものに移動します。

使用git resetすると、ブランチ自体が古い状態に戻り、最近のコミットが孤立してしまいますが、これはおそらくあなたが望んでいるものではありません。

于 2010-01-22T23:19:55.217 に答える
32

他の回答は有益ですが、これはOPが望んでいるものに最も近いと思います:

~/.bashrc に次の 2 つの関数を追加します。

# checkout prev (older) revision
git_prev() {
    git checkout HEAD~
}

# checkout next (newer) commit
git_next() {
    BRANCH=`git show-ref | grep $(git show-ref -s -- HEAD) | sed 's|.*/\(.*\)|\1|' | grep -v HEAD | sort | uniq`
    HASH=`git rev-parse $BRANCH`
    PREV=`git rev-list --topo-order HEAD..$HASH | tail -1`
    git checkout $PREV
}

使用法:

$ git_prev
Previous HEAD position was 7042c8a... Commit message2
HEAD is now at d753ecc... Commit message1

$ git_next
Previous HEAD position was d753ecc... Commit message1
HEAD is now at 7042c8a... Commit message2

: これらのコマンドは、常に切り離された HEAD状態になります。git_prevその後、現在チェックアウトされているブランチから移動するとgit_next、最終的に最新のリビジョンに戻りますが、切り離された HEAD 状態になります。git checkout BRANCH_NAME正常に戻るために行います。

于 2014-04-19T16:03:41.103 に答える
15

試してみてくださいgit reflog。これは、コミットを切り替えるために行ったコミットとチェックアウトをリストします。以前のコミットにチェックアウトしたときに失ったコミットも含まれます。次に、そのコミットに切り替える

ことができます。git checkout <hash of a commit>

お役に立てれば!

于 2014-07-29T23:42:07.213 に答える
7

別のバージョンのファイルをチェックアウトするには、次を使用します。

git checkout rev -- filename

revには、コミットの ID、ブランチの名前、タグの名前、または相対バージョンを指定できます

を使用してバージョンを調べ、必要なファイルのバージョンを確認しますgit loggitk

このバージョンのファイルを永続的にするには、ファイルをコミットする必要があります。git add filename; git commit filename

マージを行うため、バージョンを調べることはお勧めgit pullしません。現在の状態を変更する可能性があります。

git resetこの場合、git addコミットしないことにしたファイルでない限り、使用する必要はありません。

于 2010-01-26T13:14:10.787 に答える