Git操作筆記

新建Git專案

可以使用git branch -a命令得知在Git初始化階段主分支尚未被建立,因使用git checkout -b <branch_name>時並不會創建新分支,而是更改未來的主分支名稱。

新的本地端 -> 新的遠端

GitHub為例(主要分支名為main):

git init -b main
git remote add origin <your repository link>
git add .
git commit -m "Initial commit"
git push -u origin main

新的遠端 -> 新的本地端

GitHub為例(主要分支名為main):

git init -b main
git remote add -f -m main origin <your repository link>
git checkout -b main -t origin/main

客隆遠端儲存庫

進行協作,先在目前資料夾路徑cloone遠端儲存庫

git https://github.com/[UserID]/[projetID].git .

新增多個遠端儲存庫(一次 Push 到多個遠端)

git remote set-url origin --push --add <遠端路徑>

移除目前git對目錄的追蹤

git rm -r --cached <your directory>

Branch

建立branch

  1. 創建本地branch並新增對應的遠端branch
    ​​​git checkout -b new_branch # 建立 local branch
    ​​​git push -u origin new_branch # 建立對應的遠端 branch
    
  2. 根據遠端branch建立對應的本地branch
    ​​​git checkout origin/new_branch -b new_branch # 建立 local new_branch 並與遠端連接
    

切換branch

git checkout branch_name

合併branch

  1. 強制不使用fast-forward來合併
    ​​​git merge -m "merge commit message ..." --no-ff otherBranch # 不使用fast-forward
    

刪除Branch

  1. 本地Branch
    ​​​git branch -d <branch_name>
    ​​​git branch -D <branch_name> #強制刪除
    
  2. 遠端Branch
    ​​​git push -d origin <branch_name>
    

設定Branch 的 upstream

git branch <branch_name> -u <remote_name>/<branch_name>

Commit

撤銷Commit

  1. 直接刪除本地的1個Commit,並強制更新至遠端
    option :
    • soft : 緩存區和工作目錄都不會被改變。
    • mixed :默認選項。緩存區和你指定的提交同步,但工作目錄不受影響。
    • hard : 緩存區和工作目錄都同步到你指定的提交。
    ​​​git reset <option> HEAD~1
    ​​​git push origin -f
    
  2. 創建新的Commit並在其中撤銷1個Commit的更改
    ​​​git revert HEAD~1
    

Tag

重新命名標籤

git tag new old
git tag -d old
git push origin :refs/tags/old
git push --tags

刪除標籤

git push --delete origin <tagName> #遠端
git tag -d <tagName>

Stash (擱置)

創建擱置

git stash save [message]

顯示擱置清單

git stash list

恢復到最新的擱置,或恢復到指定擱置

git stash pop [stash ID]

刪除最新的擱置,或刪除指定擱置

git stash drop [stash ID]

刪除所有擱置

git stash clear

Sub Module

增加 submodule

git submodule add <.../Author/repo.git> <dir/repo>

更新 submodule

初始化更新

git submodule update --init --recursive

之後更新

git submodule update --recursive --remote

移除 submodule

git submodule deinit the_submodule
git rm the_submodule
# Unix
rm -rf .git/modules/path_to_submodule
# PowerShell
rm .git/modules/path_to_submodule -r -fo

Reset submodule

git submodule deinit -f .
git submodule update --init --recursive

Squash (壓縮)

將多個commit壓縮成一個提交記錄。

Merge Squash

用於合併不同分支時,希望在合併後只有一個提交記錄。

$ git merge —-squash <branch_name>

Rebase Squash

合併本地端所在分支的提交紀錄,用於整理自己的開發歷程。

$ git rebase -i <shl-1>

可使用git log —-oneline查看目前提交記錄

Cherry pick

在原始提交消息中附加(cherry pick from commit ...)並合併提交

git cherry-pick -e -x <commit>

從commit選擇某些檔案的更改

Get the commit

git cherry-pick -n <commit>

Unstage everything

git reset HEAD

Stage the modifications you want to keep

git add <path>

Make the work tree match the index

# (do this from the top level of the repo)
git checkout .

使用git worktree簡單部署到GitHub頁面

git checkout --orphan gh-pages #建立並切換本地孤立分支 gh-pages
git reset #清除內容索引
git commit --allow-empty -m "Initial commit" #創建空的初始commit
git checkout --force master #強制切換本地分支 master,消除有關孤立分支覆蓋文件的警告
git worktree add <folderPath> gh-pages # 新增一個子目錄到worktree,並成為gh-pages分支

#...產生文件到子目錄...

cd <folderPath> #切換至子目錄,即切換至gh-pages分支
git add --all #文件加入暫存區
git commit -m 'commit message' #創建commit
git push #推送至遠端
cd .. #切換回工作目錄

上游Git:保持最新並做出貢獻

新增upstream git

git remote add upstream <git link>

獲取上游git最新進度

git fetch upstream
git fetch upstream --tags # If the project has tags

本地 git master 分支為上游git鏡像

git checkout master
git merge upstream/master

當您想與上游維護人員分享一些工作時,您將創建一個功能分支。如果您滿意,請將其推送到您的遠程存儲庫。

您也可以使用rebase,然後merge以確保上游有一組乾淨的提交(理想情況是一個)來評估:

git checkout -b feature-x
#some work and some commits happen
#some time passes
git fetch upstream
git rebase upstream/master

如果你需要將一些提交壓縮成一個,你可以在這一點上使用rebase interactive

完成上述步驟後,只需簡單推送即可在遠程fork中發布您的工作:

git push origin feature-x

如果您在發布遠程分支功能後,因為上游維護人員提供了一些反饋必須更新遠程分支功能-x,則會出現一個小問題。你有幾個選擇:

  • 使用您和上游的更新創建一個新分支。
  • 在本地分支合併來自上游的更新,這將記錄合併提交。這將使上游存儲庫混亂。
  • (建議使用)在上游更新的基礎上Rebase本地分支,並強制推送到遠程分支:
    ​​git push -f origin feature-x
    

Gerrit

拉取Patchset

# list changes
git ls-remote
# fetch patchset 1 of change 10647
git fetch <repo> refs/changes/47/10647/1
# checkout new branch as the patchset
git checkout -b <branch> FETCH_HEAD 

修改先前commit (before HEAD)

# if to modify commit bbc643cd
git rebase --interactive bbc643cd~

在預設編輯器中,在提到bbc643cd的行中修改pickedit, 儲存文件並退出。

git 會移到bbc643cd提交,執行以下命令進行更改

git commit --amend

更改完畢後執行以下命令返回HEAD

git rebase --continue

提交更改到Gerrit

git push origin HEAD:refs/for/<target-branch>