Git操作についてのメモ。
やりたいことは以下。
main
ブランチから、backup-20210729
ブランチを作成した- その後
main
ブランチにはいくつかのコミットが追加された main
ブランチをbackup-20210729
ブランチと同じ状態に戻したいmain
ブランチの変更はバックアップしておきたい
たぶんいろいろやり方はあるが教えてもらった一つの手順。
前準備
GitHubでtestリポジトリを作成し、ローカルリポジトリをセットアップする。で作業する。
mkdir test cd test echo "# test" >> README.md git init git add README.md git commit -m "first commit" git branch -M main git remote add origin git@github.com:sotoiwa/test.git git push -u origin main
ブランチを作成。
git branch backup-20210729
メインブランチにいくつかコミット。
echo hello > test1.txt git add . git commit -m "add test1.txt" echo hello > test2.txt git add . git commit -m "add test2.txt" echo hello > test3.txt git add . git commit -m "add test3.txt"
手順
ローカルのmain
で作業する。
戻したいコミットを確認する。aacedb6
が戻したいコミット。
$ git log --all --oneline --graph * a525f7a (HEAD -> main) add test3.txt * b4607ca add test2.txt * d794b74 add test1.txt * aacedb6 (origin/main, backup-20210729) first commit
ローカルのmain
のHEADをaacedb6
に戻す。--soft
なのでファイルは最新のままになる。
git reset --soft aacedb6 # ブランチ名指定でもOK # git reset --soft backup-20210729
状態を確認する。ファイルの変更が差分として出ている。
$ git status On branch main Your branch is up to date with 'origin/main'. Changes to be committed: (use "git restore --staged <file>..." to unstage) new file: test1.txt new file: test2.txt new file: test3.txt
main
のHEADは20210729
と同じになっている。
$ git log --all --oneline --graph * aacedb6 (HEAD -> main, origin/main, backup-20210729) first commit
バックアップのために差分をまとめた新しいコミットを作る。
git add . git commit -m "add some files"
状態を確認する。
$ git log --all --oneline --graph * 0970403 (HEAD -> main) add some files * aacedb6 (origin/main, backup-20210729) first commit
ローカルのmain
をリモートのorigin/somefiles
としてpushしておく。
git push origin main:somefiles
あるいはここからローカルにブランチを切る。
git branch somefiles
状態としてはこうなる。
$ git branch -a backup-20210729 * main somefiles remotes/origin/main remotes/origin/somefiles $ git log --all --oneline --graph * 0970403 (HEAD -> main, origin/somefiles, somefiles) add some files * aacedb6 (origin/main, backup-20210729) first commit
ローカルのmain
のHEADを再びaacedb6
に戻す。今度は--hard
でファイルも戻す。
git reset --hard aacedb6
こうなる。
$ git log --all --oneline --graph * 0970403 (origin/somefiles, somefiles) add some files * aacedb6 (HEAD -> main, origin/main, backup-20210729) first commit
備考
- バックアップ用にブランチを切っていたかどうかはあまり関係ない
reset --soft
を使っているのはコミットログをまとめるためなので、ブランチを切っておいてから--reset hard
でもよい