職案人

求職・歴史・仏教などについて掲載するつもりだが、自分の思いつきが多いブログだよ。適当に付き合って下さい。

git resetでコミットを取り消す方法

2022年11月30日 | Git
git resetでコミットを取り消す方法


【開発環境】
OS:Win11(64ビット)
git version 2.37.3.windows.1
VSCode1.72.2


【git resetとは】
git resetは現在のブランチの最新のコミットから、指定したコミットの上までをごっそり削除するコマンド。すなわち、指定したコミットまでコミット履歴を遡るということです。

【Git のシステムのおさらい】
・初期状態

・ワーキングツリー(作業ディレクトリ)にあるファイルを更新する

・addを実行し、インデックス(コミットするためのファイルの状態)に移動させる

・commitを実行し、ローカルリポジトリに移動させる

・最後はpushで、Githubのリモートリポジットへ移動させるが、git resetは、push前の状態でしか使うことだできない!

【git resetのオプション】
1.直前のコミットを取り消したい(コミットのみ取り消し)
git reset --soft HEAD^
 HEAD^:直前のコミットを意味する。
 HEAD~{n} :n個前のコミットを意味する。
--softなので、インデックス・ワーキングツリーはそのまま

2.直前のコミットを取り消したい(マルっと消したい)
git reset --hard HEAD^
 --hardなので、「インデックス・ワーキングツリー」も1つ前のコミットの状態に戻る。

3.コミット後の変更を全部消したい
git reset --hard HEAD
--hardなので、「HEADの位置・インデックス・ワーキングツリー」を全てHEADの位置に動かす。
HEADの位置はそのまま。
「インデックス・ワーキングツリー」の変更が消せる。

4.addを取り消したい
git reset --mixed HEAD
または
git reset HEAD
--mixed(or オプション無し)なので、「HEADの位置・インデックス」をHEADの位置に動かす
従って、インデックスの変更(addした内容)のみ元に戻す。

5.間違えてgit resetしちゃったら・・・
git reset --hard ORIG_HEAD
直前のリセットを取り消したいなら

【サンプル】
1.新たにフォルダー「reset_test」を作り、リポジットする
PS D:\Git\reset_test> git init
Initialized empty Git repository in D:/Git/reset_test/.git/
2、「R_test.txt」ファイルをインデックスに加える
PS D:\Git\reset_test> git add .
3.コミットして、headに移す
PS D:\Git\reset_test> git commit -m 'first commit'
[main (root-commit) e61b146] first commit
1 file changed, 1 insertion(+)
create mode 100644 R_test.txt
PS D:\Git\reset_test>
PS D:\Git\reset_test> git log
commit e61b146e0dc76488dbd11a11d177baf06c5ffc12 (HEAD -> main)
Author: shyokuanjin <shyokuanjin@gmail.com>
Date: Tue Nov 29 11:19:14 2022 +0900

first commit

・2つ目のファイル「R_test2.txt」を作る
PS D:\Git\reset_test> git add .
PS D:\Git\reset_test> git commit -m 'second commit'
[main 39c36b8] second commit
1 file changed, 1 insertion(+)
create mode 100644 R_test2.txt
PS D:\Git\reset_test> git log
commit 39c36b87463c9a26b509defb3fad40f74c569c6b (HEAD -> main)
Author: shyokuanjin <shyokuanjin@gmail.com>
Date: Tue Nov 29 15:17:15 2022 +0900

second commit

commit e61b146e0dc76488dbd11a11d177baf06c5ffc12
Author: shyokuanjin <shyokuanjin@gmail.com>
Date: Tue Nov 29 11:19:14 2022 +0900

first commit

・三番目のファイル「R_test3.txt」を作る
PS D:\Git\reset_test> git add .
PS D:\Git\reset_test> git commit -m 'third commit'
[main 25a076c] third commit
1 file changed, 1 insertion(+)
create mode 100644 R_test3.txt
PS D:\Git\reset_test>
PS D:\Git\reset_test> git log
commit 39c36b87463c9a26b509defb3fad40f74c569c6b (HEAD -> main)
Author: shyokuanjin <shyokuanjin@gmail.com>
Date: Tue Nov 29 15:17:15 2022 +0900

second commit

commit e61b146e0dc76488dbd11a11d177baf06c5ffc12
Author: shyokuanjin <shyokuanjin@gmail.com>
Date: Tue Nov 29 11:19:14 2022 +0900

first commit
Author: shyokuanjin <shyokuanjin@gmail.com>
Date: Tue Nov 29 16:08:39 2022 +0900

third commit

commit 39c36b87463c9a26b509defb3fad40f74c569c6b
Author: shyokuanjin <shyokuanjin@gmail.com>
Date: Tue Nov 29 15:17:15 2022 +0900

second commit

commit e61b146e0dc76488dbd11a11d177baf06c5ffc12
Author: shyokuanjin <shyokuanjin@gmail.com>
Date: Tue Nov 29 11:19:14 2022 +0900

first commit


■三番目のファイル「R_test3.txt」を元に戻す
1.--hard HEAD^の場合
PS D:\Git\reset_test> git reset --hard HEAD^
HEAD is now at 39c36b8 second commit
PS D:\Git\reset_test>


2.--soft HEAD^の場合
PS D:\Git\reset_test> git reset --soft HEAD^
PS D:\Git\reset_test> git status
On branch main
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
new file: R_test2.txt
コミットの前目で戻る


VSCodeで同じことをやってみる
ます、R_test2.txtを「変更」で、コミットする。

R_test1.txtのsoftを押す

同じ様になる



コメント (2)
  • Twitterでシェアする
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

GitHubでリモートリポジトリをフォーク(Fork)する方法

2022年11月25日 | GitHub
GitHubでリモートリポジトリをフォーク(Fork)する方法


■フォーク(Fork)とは
フォーク(Fork)は、GitHubが提供する機能のひとつです。

GitHubで公開されているいずれかのリポジトリを親リポジトリとして指定し、そのコピーを自分のリモートリポジトリとしてGitHub上に作成します。

フォークはもともとのGitの機能ではないためフォーク元のリポジトリと自分のリポジトリはそれぞれ独立しており、GitHubがフォーク元、フォーク先という繋がりを管理しています。

そのためリポジトリをフォークしたからといって勝手に親リポジトリの内容を変更できるわけではありません。親リポジトリに変更内容を反映するにはコミット権限を与えてもらうか、プルリクエストを送って管理者に変更内容を承認してもらう必要があります。

■フォーク(Fork)のやり方
他人のリポジトリを自分のGitHubアカウントにフォークする
・GitHubのサーチ欄に「meganein9988/mgnknowledge-learn-git」を書き込み、サーチを実行する


下記のように「meganein9988」さんのGitHubが表示されたら、「Fork」ボタンを押すだけ


Create a new forkが表示されたら
「Owner」と「Repository」を確認して、「Create fork」ボタンを押す


自分のGitHubに「mgnknowledge-learn-git」リポジトリがコピーされたら、完了


■リモートリポジットからローカルリポジットへ
・クローンしたいフォルダーにカレントを移す
PS D:\Git\rebase_test> cd d:\Git

・クローンする前にフォークした「mgnknowledge-learn-git」リポジトリのコードをコピーする


・クローンする
PS D:\Git> git clone git@github.com:shyokuanjin/mgnknowledge-learn-git.git
Cloning into 'mgnknowledge-learn-git'...
remote: Enumerating objects: 15, done.
remote: Total 15 (delta 0), reused 0 (delta 0), pack-reused 15
Receiving objects: 100% (15/15), done.
Resolving deltas: 100% (1/1), done.
PS D:\Git>
ローカルリポジットに 「mgnknowledge-learn-git」がコピーされる


・ファイルを開く


■プルリクエスト
・ファイル「README.md」に、下記のようにテキストを追加する
「プルリクエストを試してしました。
成功するかなぁ」

・再び、ファイル「README.md」を自分のリモートリポジットにpushし、「Pull requests」を押す


・「New pull request」ボタンを押す


・「meganein9988/mgnknowledge-learn-git」が表示される


・完成


コメント
  • Twitterでシェアする
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

リモートレポジトリ(origin)について

2022年11月20日 | Git
originとは

【開発環境】
OS:Win11(64ビット)
git version 2.37.3.windows.1
VSCode1.72.2

【originとは】
リモートリポジトリのアクセス先に対してGitがデフォルトでつける名前。

確認方法
下記のコマンドで確認出来る
$ git remote -v

origin git@github.com:shyokuanjin/Git_sample.git (fetch)
origin git@github.com:shyokuanjin/Git_sample.git (push)

ファイルを確認する方法
$ cat .git/config
[core]
repositoryformatversion = 0
filemode = false
bare = false
logallrefupdates = true
symlinks = false
ignorecase = true
[remote "origin"]
url = git@github.com:shyokuanjin/Git_sample.git
fetch = +refs/heads/*:refs/remotes/origin/*
実は.gitフォルダのconfigファイルにある。

【リモートレポジトリURLの変更・上書き方法】
登録したURLのみを変更するには
git remote set-url <リモートレポジトリ名> <新しいURL>
なお、
git remote add origin <URL>で上書きしようとすると、エラーが表示されます。
→fatal: remote origin already exists.

【リモートレポジトリの名前を変更・上書きする方法】
リモートレポジトリの名前:originを、変更・上書きするには
・コマンド
git remote rename <変更前のレポジトリ名> <変更後のレポジトリ名>


#レポジトリ名の変更
$ git remote rename origin changed

#確認
$ git remote -v
changed https://github.com/test-repo/app.git (fetch)
changed https://github.com/test-repo/app.git (push)

変更後は
git push changed <ブランチ名>

【リモートレポジトリを削除する方法】
登録したリモートレポジトリを削除するには
git remote rm <リモートレポジトリ名>

【リモートレポジトリを複数登録する方法】
リモートレポジトリを複数登録できます。これをすると、ブランチの内容をそれぞれのリモートレポジトリに送ることもできます。

git remote add <リモートレポジトリ名> <URL>

#リモートレポジトリの追加
$ git remote add new https://github.com/new-repo/app.git

#確認
$ git remote -v
new https://github.com/new-repo/app.git (fetch)
new https://github.com/new-repo/app.git (push)
origin https://github.com/test-repo/app.git (fetch)
origin https://github.com/test-repo/app.git (push)

リモートレポジトリとして、origin と newの2つが登録されています。
1.git push origin <ブランチ名>
2.git push new <ブランチ名>

【git pushがreject(拒否)されたときの対処法】
対処法1
$ git pull origin main から $ git push origin mainを行う

対処法2
$ git push -f <リモートレポジトリ名><ブランチ名:mainなど>  強制(force)的にプッシュする
コメント
  • Twitterでシェアする
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

コミットの履歴をスッキリさせるには

2022年11月17日 | Git
コミットのスカッシュとは


【開発環境】
OS:Win11(64ビット)
git version 2.37.3.windows.1
VSCode1.72.2
VSCodeを使って綺麗なコミットログを作る
【準備】
適当にディレクトリ「rebase_test」を作って vscode で開き、適当なファイル「READER.md」を作成した後、4 回ほどコミットします。

・git log


【squashを使ってコミット履歴をスッキリさせる】
コマンドパレットから行う
1.コマンドパレットを開く

2.GitLens: Git Rebase...をクリック

3.mainブランチをクリック

4.Rebaseを行うコミットを選択

5.1st を選択する

6.Rebase方法の選択。今回はgit rebase -i (--interactive)を行いたいのでInteractiveを選ぶ
下図の下側

7.下図のようになる

8.コミットに対してアクションの選択

9.START REBASEをクリック

10.以下のようなタブが開く
任意のコミットメッセージに変更し、Ctrl+W or x をクリックでタブを閉じる

11,Rebaseが実行される

以上

コメント
  • Twitterでシェアする
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

git Rebase

2022年11月16日 | Git
git Rebase(リベース)


【開発環境】
OS:Win11(64ビット)
git version 2.37.3.windows.1
VSCode1.72.2

【rebaseとは】
まずrebaseコマンドを一言で言い表せば「指定したコミットを、ブランチを変えて作り直したり、ひとまとめにしたりして、ログを綺麗にするコマンド」


・2つにブランチする


・マージンした場合


・リベースした場合


rebaseの方が、更新ログが一直線で見やすいですね!これなら過去の更新履歴を追う時も見やすい

■実行してみる
・thirdブランチを作る
PS D:\Git\Gitmanabe> git branch 'third'
PS D:\Git\Gitmanabe> git branch
* main
second
third

・カレントブランチをthirdに切り替える
PS D:\Git\Gitmanabe> git checkout third
Switched to branch 'third'
PS D:\Git\Gitmanabe> git branch
main
second
* third

・ファイルを作る


・mainブランチにもファイル「4_test.txt」を作り、プッシュする
PS D:\Git\Gitmanabe> git checkout main
Switched to branch 'main'
Your branch is up to date with 'origin/main'.
PS D:\Git\Gitmanabe> git status
On branch main
Your branch is up to date with 'origin/main'.
nothing to commit, working tree clean
PS D:\Git\Gitmanabe>

・カレントをthirdに戻し、mainとリベースする。
PS D:\Git\Gitmanabe> git checkout third
Switched to branch 'third'
Your branch is up to date with 'origin/third
PS D:\Git\Gitmanabe> git rebase main
Successfully rebased and updated refs/heads/third.
PS D:\Git\Gitmanabe>

PS D:\Git\Gitmanabe> git status
On branch third
Your branch and 'origin/third' have diverged,
and have 2 and 1 different commits each, respectively.
(use "git pull" to merge the remote branch into yours)

nothing to commit, working tree clean

以上で
ただし、gitHubにはプッシュされない


mergeとrebaseの違い
具体的な使い分け方ですが、二つのコマンドの一番の違いは「既存のコミットへ影響を与えるか・与えないか」

「rebaseコマンド」は、処理を作り直すが、「mergeコマンド」は既存コミットに影響を与えずにマージコミットを作成する。この点がこの二つの一番の違い

最後に、mainブランチにマージする
PS D:\Git\Gitmanabe> git merge third
Updating af04f20..db3bef1
Fast-forward
3_test1.txt | 1 +
4_test.txt | 1 +
2 files changed, 2 insertions(+)
create mode 10064


コメント
  • Twitterでシェアする
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする