Git三大核心問題總說:版本、分支、遠端

2020-09-19 12:04:10

關於Git

重要的且絕對優質的學習資源

廖雪峰的官方網站:Git教學
Git Pro Book
Git官方檔案

Git核心思想

  • 版本控制(SVN也有)
  • 低成本分支:通過移動指標實現
  • 本地-遠端的分散式:不把雞蛋放在一個籃子裡
  • 應用思想:殊途同歸是Git哲學。

修改與版本回退

詳見git checkout/git reset/git revert/git restore常用回退操作

在Git中,commit、版本和HEAD之間有著密切聯絡。commit即是版本,HEAD為(當前所在的)commit的參照。詳見HEAD相關的Git時間線結構基本概念總結

跳出修改(checkout)

檢出當前修改,這裡用於消除工作樹改動(工作樹就是本地資料夾)

使用格式

git checkout -- <file_name>

注意檔名稱之前有個空格。只能消除改動,不能消除untracked檔案。消除untracked檔案需要使用clean指令

  • 如果沒有stage,就復原工作區的changes

    也可以使用git restore --worktree <filename>git restore -W <filename>

  • 如果已經stage,復原這次stage

重設版本(reset)

重設HEAD指標,用於版本的回退。

# (對某branch)
git reset <version>  <filename>`
  • version多用HEAD指標表達,也可以直接用版本號

  • HEAD對應取消unstage,HEAD^為回退一版,HEAD~n為回退n版

    unstage還可以使用git restore --staged <filename>或者git restore -S <filename>。回退到特定版本可以直接加版本號。

  • 預設為fixed模式,回退的改動返回工作樹(unstaged changes)。

放棄(restore)

意為重置,推翻先前。restore的兩類用法可以被checkout和reset解決,分別為復原工作區改動和版本回滾,在前面已經說過。但對於discard changes、unstage,restore的語法可以非常簡明:

git restore <filename>

詳見https://www.jianshu.com/p/dcef204dba74

覆盤(revert)

意為再來一遍。以前的記錄不會抹掉。把某個指定版本續在變化時間線後面。

分支操作:Git的靈魂

這是Git最巧妙的設計。簡單如下幾步(圖見HEAD、master 與 branch):

  1. 建立分支在這裡插入圖片描述

  2. 平等、隔離地開發

在這裡插入圖片描述

  1. 合併分支在這裡插入圖片描述

增、改、合的主要語法

詳見易百教學
檢視分支:

git branch

建立分支:

git checkout -b <branch-name> # 建立+切換
git branch <branch-name>

切換分支:

git checkout <branch-name>
git switch <branch-name>
git switch -c <branch-name> # 建立+切換

合併分支:
:合併分支branch1到當前分支:

git merge branch1

解決衝突

兩種常見的衝突。

第一種:管理版本之間的衝突:

git diff <filename>

使用diff命令之後,會在原檔案中出現

<<<<<<<<<<<<<<<<<<<<<<<<<<
==========================
>>>>>>>>>>>>>>>>>>>>>>>>>>

分隔開的兩段程式碼,將它們手動匯成一段即可。

在遠端共同作業中還有一個衝突的情況,即將一個空庫和本地庫建立關係的時候,對pull使用--rebase引數,即可將它們匯成合規的commit時間線。

遠端共同作業

remote端也有類似於原生的一個HEAD指標,名為FETCH_HEAD,相關問題詳見https://www.cnblogs.com/Venom/p/5477367.html

關聯遠端庫

關聯方法

git clone <url>
# 或
git remote add [庫名]

取消關聯:

git remote rm origin

庫名預設為origin,若要進行Gitee備份,可以將其同GitHub的關聯先刪掉,然後重新定名為github。

推播改動(push)

遠端操作的最基礎語句:利用本地改變遠端。個人使用時(分支保證up-to-date)常用。

語法:

git push [主機名] [本地分支]:[遠端分支]

範例情形

  • 建立遠端分支master:git push origin master

  • 刪除遠端分支master:git push origin :master(把一個空分支推到指定的分支origin/master)

    origin表示主機名,以上兩句的推播始末分別對應於master:master[null]:master

  • 建立local-remote追蹤:git push -u origin master,或git branch --set-upstream master origin/next

  • 有追蹤關係的推播更新:git push origin(省略分支名,預設為當前所在分支和遠端對應分支)

  • 僅有一個追蹤分支:git push

通常遠端庫會比原生的新,所以可能無法正常完成push,所以要先pull再push。

遠端拉取(pull)

指令相關詳見https://www.yiibai.com/git/git_pull.html

從remote取回(fetch)且匯入本地(merge)處理not-up-to-date問題。
相當於如下三條語句的過程:

git fetch origin master:tmp
git diff tmp 
git merge tmp

其語句結構和push一樣。

如果建立新倉庫的過程出現不相關拒絕merge的情況,如下:

fatal: refusing to merge unrelated histories

則對其rebase,消除版本變化過程中的環

git pull --rebase origin master

參考檔案

(侵權請聯絡刪除)

廖雪峰的Git教學
Git官網檔案
git checkout/git reset/git revert/git restore常用回退操作
HEAD、master 與 branch
GIT復原修改 restore

易百教學:
git branch命令
git pull命令

git fetch, git pull 以及 FETCH_HEAD
簡單對比git pull和git pull --rebase的使用
Git submodule實戰
刪除git庫中untracked files(未監控)的檔案

連結列表

https://www.liaoxuefeng.com/wiki/896043488029600
https://git-scm.com/doc
https://blog.csdn.net/albertsh/article/details/104719370
https://www.jianshu.com/p/4219b6f62ce3
https://www.jianshu.com/p/dcef204dba74
https://www.yiibai.com/git/git_branch.html
https://www.yiibai.com/git/git_pull.html
https://www.cnblogs.com/Venom/p/5477367.html
https://www.cnblogs.com/kevingrace/p/5896706.html
http://blog.jqian.net/post/git-submodule.html
https://blog.csdn.net/ronnyjiang/article/details/53507306