web-dev-qa-db-ja.com

Git:コミット間を行き来する方法

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

ブランチの歴史を行き来する必要があります。つまり、すべてのファイルを古いリビジョンの状態に戻す必要があり、その後リポジトリの最新の状態に戻す必要があります。コミットする必要はありません。

SVNでは、

svn up -r800

リビジョン800に到達するには

svn up

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

コミットしたいハッシュを知っているので、試しました

git reset <hash>

私はそこに着くようです。しかし、私は試しました

git pull

しかし、それは紛争について不平を言っています。

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

SVNの観点から考えているので、遠慮なくニースのチュートリアルを参照してください。すでにチェックしていることに注意してください http://git.or.cz/course/svn.html および http://www.youtube.com/watch?v=8dhZ9BXQgc4

ありがとう、オンドラ。

70
Ondra Žižka

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

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

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

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

最新のリビジョンに戻すには、git checkout masterを使用します。コマンドを実行する前に、必ずgit statusを実行してください。このコマンドは、現在のレポ条件について知る必要があるもの、およびそれを正しくするために必要なアクションを表示します。 git pullおよびgit Pushを実行する前に、git status結果にテキストworking directory cleanが含まれていることを確認することをお勧めします。

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

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

65
Donny Kurnia

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

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

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

37
CB Bailey

他の答えは有益ですが、私はこれが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

:これらのコマンドは常に detached HEAD 状態に入ります。現在チェックアウトされているブランチからgit_prevを実行してからgit_nextを実行すると、最新のリビジョンに戻りますが、HEAD状態になります。通常に戻るにはgit checkout BRANCH_NAMEを実行します。

26
Raine Revere

git reflog、これは、コミット間で切り替えるために行ったコミットとチェックアウトをリストします。以前のコミットへのチェックアウト時に失ったコミットも含みます。

その後、git checkout <hash of a commit>そのコミットに切り替えます。

お役に立てれば!

7
Ryan Le

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

git checkout rev -- filename

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

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

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

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

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

6
Jamey Hicks