GitHub, GitLab, Gitのオペレーション

gitは非常に便利な履歴管理ソフトですが、コマンド操作がメインなので理解を深めるために都度文章や図に纏めて復習することをお勧めします。

フォークしたレポジトリに最新の本家レポジトリの内容をマージする方法について。

まず本家レポジトリmain-repoのリモートアドレスを追加します。リモート名はbase-repo(任意)としました。

git remote add base-repo git://github.com/main-repo/repo.git

リモートが追加されたかどうか確認します。

git remote -v

本家レポジトリのfetchフェッチ(ファイル郡のロード)とmergeマージ(ファイル群の上書き)をpullコマンドで実行します。(masterブランチ上で実行していますが、新規ブランチを作成し、そこでpullコマンドを実行、masterブランチにcheckoutチェックアウトしmergeマージした方がいいかもしれません。)

git pull base-repo master

フォークしたサーバに変更内容をpushプッシュ(アップロード)します。

git push origin

大まかなレポジトリの種類

① githab上の本家レポジトリ
git@github.com:main_repo/test.git

② github上で①からフォーク(folk)したレポジトリ(repositry) —>フォークリモート:通常originという名称
git@github.com:my_repo/test.git

③ ②を自分のPCへクローン(clone)したローカルレポジトリ
git clone git@github.com:my_repo/test.git

フォークレポジトリとローカルレポジトリ

②と③は各々変更してもpushやfetchまたはpushコマンドで双方の内容を容易に一致させることができます。

本家レポジトリとローカルレポジトリ

①と②または③との整合性を取るためには、

  1. ローカルレポジトリ内で①をリモートとして追加登録
  2. fetch,mergeコマンドでローカルレポジトリに本家レポジトリの内容を上書き
  3. フォークリモートへpushします。

<補足説明>
1.リモートの追加と確認は以下の手順で行います。
https://help.github.com/articles/configuring-a-remote-for-a-fork/

リモートの確認

$ git remote -v
origin https://github.com/YOUR_USERNAME/YOUR_FORK.git (fetch)
origin https://github.com/YOUR_USERNAME/YOUR_FORK.git (push)

オリジナルリモートの追加(リモート名:upstream)

$ git remote add upstream https://github.com/ORIGINAL_OWNER/ORIGINAL_REPOSITORY.git

リモートの再確認

$ git remote -v
origin https://github.com/YOUR_USERNAME/YOUR_FORK.git (fetch)
origin https://github.com/YOUR_USERNAME/YOUR_FORK.git (push)
upstream https://github.com/ORIGINAL_OWNER/ORIGINAL_REPOSITORY.git (fetch)
upstream https://github.com/ORIGINAL_OWNER/ORIGINAL_REPOSITORY.git (push)

Githubへのアクセスに2段階認証している場合には、ユーザパスワードの代わりにトークンを生成して、これを利用します。
トークンはGithubのユーザページのSettings—>Deveropper settings—>personal access tokensで生成して下さい。
https://help.github.com/articles/creating-a-personal-access-token-for-the-command-line/

リモートURLの変更(sshからhttpsへの変更、またはその逆)
https://help.github.com/articles/changing-a-remote-s-url/#switching-remote-urls-from-ssh-to-https

Switching remote URLs from SSH to HTTPS

$ git remote set-url origin https://github.com/USERNAME/REPOSITORY.git

Switching remote URLs from HTTPS to SSH

$ git remote set-url origin git@github.com:USERNAME/REPOSITORY.git

Git Rebase

https://git-scm.com/docs/git-rebase

ex) topicにチェックアウトしている状態で最新masterの内容を反映

      A---B---C topic
     /
D---E---F---G master
$ git rebase master
or
$ git rebase master topic

would be

              A'--B'--C' topic
             /
D---E---F---G master

フォークレポジトリに最新のフォーク元レポジトリの内容を反映

フォークレポのmaster上で実施

Step 1: リモートにフォーク元レポ:base-repo(名称任意)を追加

git remote add base-repo https://github.com/original-repo/goes-here.git

Step 2: ブランチを含むフォーク元レポをフェッチ

git fetch base-repo

Step 3: rebaseコマンドによるフォークレポのmasterをフォーク元レポのmasterに書換え

git rebase base-repo/master

Step 4: オリジナルリモートorigin(フォークレポ)masterにプッシュ

git push origin master --force

GitLabパブリックサーバへの登録

GitHubをMicrosoftが管理するようになってから、アップロードしたコードの取り扱いなどについて色々と条件が変更になっているようで、GitLabへ移行するユーザが増えているようです。GitLabはGitHub同様、パプリックサーバが用意されていることに加え、ローカルで専用サーバを構築することもできるためプライベートなコードの管理についてはこちらの方が便利です。今後はGitLabへシフトした方がいいかもしれません。

SSHキーペアを利用してリモートサーバへアクセス

Algorithm Public key Private key
ED25519 (preferred) id_ed25519.pub id_ed25519
ED25519_SK id_ed25519_sk.pub id_ed25519_sk
ECDSA_SK id_ecdsa_sk.pub id_ecdsa_sk
RSA (at least 2048-bit key size) id_rsa.pub id_rsa
DSA (deprecated) id_dsa.pub id_dsa
ECDSA id_ecdsa.pub id_ecdsa

For example, for ED25519:

$ ssh-keygen -t ed25519 -C "<comment>"

For 2048-bit RSA:

$ ssh-keygen -t rsa -b 2048 -C "<comment>"

Ed25519: high-speed high-security signatures
https://ed25519.cr.yp.to/

作成したキーペアのパブリックキーの中身を、GitLabのアカウントメニューの “SSH Keys” から登録後アクセスできるか確認

$ ssh -T git@gitlab.com
Welcome to GitLab, @ficusonline!

ユーザとパスワードの入力を省くため、リモートをhttpsではなくSSHで登録

$ git remote add origin git@gitlab.com:<User_Name>/<Project_Name>.git

Error: “you are not allowed to push code to protected branches on this project”

プロジェクトメニューから "Settings" → "Repository" → "Protected branches"Expand ボタンをクリックして設定事項を展開します。"Unprotect" をクリックするか、 "Developers can push" を選択して下さい。