Git操作のメモ

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でもよい