在 github 上 fork 一個 repo。基本上是開新的 branch,並以此為基礎送 pull request 給 upstream。

  1. 簽出代碼,master 與上游同步。
    $ git clone git@github.com:azru0512/lbd.git
    $ cd lbd
    $ git remote add upstream https://github.com/Jonathan2251/lbd.git
    # 將分支 master 和 upstream 的分支 master 同步。
    $ git branch --set-upstream upstream/master
    # git fetch upstream; git merge upstream/master 等同底下指令。
    $ git pull upstream master
    # 建立並切換分支
    $ git checkout -b format
    # 將分支 push 回 github 上的 (remote) origin
    $ git push origin format
    # 切換回 master
    $ git checkout master
  1. 挑幾個 commit 合併回自己的版本。
    # 更新 master (由他人的 repo fork 而出),自己的是 private。
    $ git checkout private
    $ git log --graph --oneline --all
    | | * 2b87a72 Correct typing
    | | * 2224bae Correct typing
    | |/
    |/|
    * | 1fd948f fix 80 characters of column width in funccall.rst
    # 挑選 master 某個 commit 合併。
    $ git cherry-pick 2224bae
    # 處理需要合併的檔案。
    $ git status
    # Unmerged paths:
    #   (use "git add <file>..." to mark resolution)
    #
    #       both modified:      source/funccall.rst
    #
    $ git add source/funccall.rst
    $ git commit
    $ git push
  1. 將分支 master 與另一個遠端分支 master 同步。寫入設定。
    $ git clone git@github.com:azru0512/lbd.git -b master
    $ cd lbd
    $ git config --global branch.master.remote https://github.com/Jonathan2251/lbd.git
      - 將另一個遠端分支 master 的內容拉下來,同步到自己的遠端 (origin) 分支 master。
    # pull Jonathan2251/lbd.git
    $ git pull
    $ git push origin
  1. private 分支以 master 做 rebase,並處理 conflict。
    $ git checkout private 
    # 將 master 內容合併回 private 分支,將 "<<< ===" 或 "=== >>>" 其中之一消除掉。
    $ git rebase master
    $ git status
    # Not currently on any branch.
    # 顯示尚未從 master merge 回 private 的第一個 commit。
    $ git log -1 --pretty=oneline
    # 修改 conflict
    $ git mergetool
    # 手動修改 conflict 需要 add 處理完 conflict 的檔案。
    $ git add source/install.rst
    $ git commit -am "Rebase master"
    # 查看 master 和 branch 合併情況。
    $ git log --graph --oneline --all
$ git checkout -b private
$ git checkout cmdline
# 刪除 private 分支
$ git branch -D private
$ git push origin --delete cmdline
$ vi source/funccall.rst
# 檢查是否有多餘的空白
$ git diff --check 
# 合併最近兩個 commit。
$ git rebase -i HEAD~2
$ mkdir en
$ git mv Fig/ en/
# 修改最近一個 commit message。
$ git commit --amend -m "New commit message"
$ git reset HEAD^ # remove commit locally
$ git push origin +HEAD # force-push the new HEAD commit
  1. 建立分支 gh-pages。注意,gh-pages 裡必須清空,不可包含原本分支的檔案。
    $ cd repo
    $ git checkout --orphan gh-pages
    $ git rm -rf .
    $ echo "First commit" > index.html
    # 如果有檔案或是目錄以底線開頭,加上以下檔案才能正確處理。
    $ touch .nojekyll
    $ git add .
    $ git commit -m "Just to create the branch."
    $ git push origin gh-pages
  2. 修改欲建立網頁的分支,新增 Makefile 目標。
    $ git checkout master
    $ vi Makefile
    gh-pages:
        git checkout gh-pages
        rm -rf build _sources _static
        git checkout master $(GH_PAGES_SOURCES)
        git reset HEAD
        make html
        mv -fv build/html/* ./
        rm -rf $(GH_PAGES_SOURCES) build
        git add -A
        git ci -m "Generated gh-pages for `git log master -1 --pretty=short --abbrev-commit`" && git push origin gh-pages ; git checkout master
    $ git add Makefile
    $ git commit -m "Update Makefile"
    $ git push
  3. 於欲建立網頁的分支建立網頁。
    $ make gh-pages
  1. 目的是將範例程式獨立成 submodule。
    $ git submodule add git@github.com:azru0512/lbd-example.git example
    $ git commit .gitmodules lbd-example -m "Add lbd-example submodule"
    $ git submodule init
    $ git submodule update

外部連結

登录