GIT學習——每天都在用Git,那麼你係統學習過嗎?(學習過程)

你係統學習Git了嗎?

學習聖思園張龍老師的Git課程。html

使用Mac編程的好處,不是由於Mac長得好看git


Git內容學習準備

  1. 若是你尚未用Git,就不要寫代碼了。程序員

  2. GitHub倉庫的使用。github

  3. 新員工入職的時候,會讓他先用一週的時間去學習Git。web

  4. Mac(優雅的開發環境,Terminal)正則表達式

不要使用GUI入門Git。要使用命令行。shell

安裝Git編程

  1. 使用Xcode自帶的Git環境。
  2. 去官網自行下載安裝。
  3. Terminal的加強。

bashcentos

每個Linux和Mac自帶的解釋器。(可是功能不是很強大)
強大的叫:zsh.
增強版本: oh my zsh (自行安裝)緩存

清屏命令:clear or ctrl+L

建立命令:touch xxx.txt :=增刪改等。

查看命令:man cp

vi的基本使用。

必需要掌握的:Terminal操做

做爲一個JAVA程序員,應該大部分都是在Windows使用JAVA開發,可是但願不要僅僅侷限於JAVA。否則對成長很不友好。

內容大綱

  1. Git官網
  2. 常見Linux命令介紹
  3. Git在各類平臺下的安裝與配置
  4. 分佈式與集中式版本控制系統的差異
  5. 緩存區、工做區與Git提交
  6. 版本回退
  7. 修改與撤銷修改,文件的添加與刪除
  8. Git對象類型與索引
  9. Git分支
  10. 如何建立,切換與刪除分支
  11. Git分支在項目中開發的使用
  12. Git分子在工程化項目的最佳實踐
  13. 分支常見重要命令詳解
  14. Git merge
  15. Git衝突解決策略
  16. HEAD詳解
  17. Git Commit修改詳解
  18. 遠程版本庫介紹
  19. 如何使用遠程版本庫
  20. Git Push、Pull、fetch使用與注意事項
  21. Git合併的基本原則
  22. Git別名、config文件詳解
  23. Git tag詳解
  24. 如何建立與推送tag
  25. Git feature分支詳解
  26. 什麼時候使用submodule
  27. Git subtree詳解
  28. Git subtree的使用方式詳解
  29. .gitignore的正確使用方式
  30. Git私服GitLab的搭建方法
  31. 在公司內部使用gitlab做爲版本控制服務器
  32. GitLab使用詳解
  33. GitHub的使用方式
  34. 搭建基於Intellij IDEA的Java開發環境
  35. 搭建基於Gradle的JAVA開發環
  36. Git與Intellij IDEA 的整合方式詳解
  37. Gradle初步使用
  38. .gitignore最佳實踐

學習方法:知道一,更知道二,更知道三。

瞭解Git

Git簡史

開發Git來管理Git

CVS、SVN與Git

不會Git,就別開發代碼了。

Git、GitHub與GitLab

Git設計目標

爲何要使用Git

  • 本地創建版本庫
  • 本地版本控制
  • 多主機異地協同工做
  • 重寫提交說明
  • 有後悔藥能夠吃
  • 更好用的提交列表
  • 更好的差別比較
  • 更完善的分支系統
  • 速度極快

Git基礎

  • 直接記錄快照,而非差別比較
  • 近乎全部操做都在本地執行
  • 時刻保持數據完整性
  • 多數操做僅添加數據
  • 文件的三種狀態
    • 已修改
    • 已暫存
    • 已提交

Git文件狀態

Git文件:已經被版本庫管理的文件

已修改:在工做目錄修改Git文件

已暫存:(indea-staged)對已經修改的文件執行Git暫存操做,將文件存入暫存區

已提交:將已經暫存的文件執行Git提交操做將文件存放版本庫

pic1

Git的文件狀態以下

Pic2

本地版本庫與服務器版本庫

pic3

Git 安裝

Linux

Mac

Windows

須要自行了解 SSH

GUI:source tree & GitHub Desktop

獲取本地SSH

服務器上的 Git - 生成 SSH 公鑰

ssh-keygen -t rsa  ## 三次回車,跳過密碼

開始使用Git

Git經常使用命令

得到版本庫

git init
git clone

查看信息

git help
git log
git diff

版本管理

git add 
git commit
git rm

遠程協做

git pull
git push

其餘經常使用指令

git status  ##查看狀態
git log ##查看commit記錄
git checked -- xxx.txt ##丟棄已經修改的
git reset HEAD xxx.txt ##回到修改前的狀態
git commit -m 'commit message' ##簡要信息顯示並commit

echo 'welcome' > xxx.txt  ##重定向welcome 到這個文件的輸出
git add . ##當前目錄全部文件都add
git log -3 ## 最近三條的log

git help config ## 獲取配置
git config --help ## 幫助文檔
man git-confgi ##幫助文檔

常見功能

配置username && email**

  1. /etc/gitconfig (幾乎不會使用,針對於整個操做系統的)

    git config --system
  2. ~/.gitconfig (很經常使用,針對於當前用戶的全部配置)

    git config --global
  3. .git/config (針對於特性項目)

    git config --local

Git的提交ID(commit id)是一個摘要值,這個摘要值其實是個sha1計算出來的

刪除(兩種方式)

git rm 和 rm的區別
git rm : 
1.刪除文件
2.而且將刪除的文件歸入到暫存區當中(stage,index)
若想恢復刪除的文件須要執行兩個動做
1. git reset HEAD test2.txt ,將待刪除的文件從暫存區恢復到工做區
2. git checkout -- test2.txt ,將工做區中的修改丟棄掉

rm: 
將文件刪除文件,這時候被刪除的文件沒有歸入暫存區當中  
注意:
這時候若是直接commit,是提示沒有修改記錄的。
想要歸入暫存區的話,須要使用 git add xxx.txt 把這個文件的刪除再加入暫存區。

重命名文件(兩種方式)

git mv name1.txt name2.txt  (歸入暫存區的修更名字操做)
回退:
git reset HEAD name1.txt
git checked -- name1.txt

也可使用操做系統的mv指令,關係和刪除是相同的

日誌修改

git commit --amend -m 'new message' ##把上次保存的commit消息替換掉

熟練使用命令行,是提高開發效率的第一步。

.gitignore文件

操做的時候自動過濾制定的文件。放置在項目的根目錄下

支持全文件名/正則表達式/後綴名/通配符

setting.properties ##刪除指定文件
*.b  ##後綴名
!a.b ## !除了什麼
/TODO ##僅僅忽略項目根目錄下的TODO文件, stu/TODO 這種是不忽略的
/*/TODO ##僅僅刪除二級目錄下的TODO文件
/**/TODO ##刪除全部目錄下的TODO文件
doc/*.txt ##忽略doc目錄下的.txt文件,可是 doc/a/a.txt 是不會被忽略的
doc/**/*.txt ##忽略doc目錄下的全部*.txt
build/ ## 忽略build目錄下的全部文件
#xxxx  ## 表明註釋

分支 branch

分支的基本使用

查看分支

git branch  ## 查看分支

建立分支

git branch new_branch ##建立分支

切換分支

git checkout new_branch  ##切換分支

刪除分支

git branch -d new_branch ## 刪除分支,
	## 可是不能刪除當前所處的分支。
	## 刪除 未被合併的  - 使用大寫的  D
	## 刪除 已經被合併的 - 使用小寫的 d
	## 是爲了保護你的誤操做。

建立分支的同時,切換到新分支

git checkout -b new_branch

合併分支(先修改,再合併)

git merge new_branch ##合併指定分支合併到當前分支

顯示分支的操做

git branch -v  ##顯示當前分支最後一次提交的信息(commitId 和 message)
git log
git log -3

分支的本質是什麼?

分支:一個commit對象鏈:一條工做記路線。

每個分支,會記錄上一次的commitID。(工做記路線,時間線)。

再談分支

  • HEAD指向的是當前分支

    HEAD信息存放在:.git目錄下的HEAD文件中

    git reset HEAD filename ##以前使用過的恢復指令
  • master指向提交

合併分支

  • Fast-Forward 快進 (沒有衝突文件的合併)

    • 若是可能,合併分支時Git會使用fast-forward模式

    • 在這種模式下,刪除分支時會丟掉分支信息

    • 合併時加上 --no-ff參數會禁用fast-forward,這樣會多出來一個commit id

      • git merge --no-ff dev
    • 查看日誌

      • git log - -graph
  • 出現衝突:conflict. 兩個分支修改同一個文件的同一行

    • merge出現衝突
    • 手動解決衝突
    • 使用git add file. 告訴git,你已經解決衝突
    • 使用git commit再次保存. (master上面會出現一個merge的commit記錄)
    • ::這時候使用反向合併,還會衝突嗎?並不會。由於master分支上面相對於Dev分支多了一個commit記錄,Git認爲你這個是一個快進操做。
    • 上述理解:用你本身的話就是:再次合併的時候,他們兩個的基礎是不同的。意味着:不是同時對同一個文件進行修改的。

建立分支,無非是建立了一個指針。

問題:爲何修改文件以後須要add一下,而後才能commit。(已明白,添加修改到暫存區。)

git commit -am 'commit message' ##添加全部修改文件到暫存區。而後commit。 合二爲一

版本回退

git reset --hard HEAD^ ##返回到上次提交
git reset --hard HEAD^^ ##返回到上兩次提交

git reset --hard HEAD~1 ##回到第一個提交
git reset --hard HEAD~n ##回到第第n個提交

git reset --hard commitID ##回退到指定commit

git reflg ##查看操做日誌

進階操做

git checkout && git reset 進階

git checkout -- <file> ## 丟棄指定文件在該空間下的改變
## 丟棄的是未被放在緩存區的改變
## 修改的是工做區,修改的是最後一次的修改

git reset HEAD <file> ## 將以前添加到暫存區(stage、index)的內容,從暫存區移除到工做區

git checkout 最多見的是用在分支的切換上

git checkout -b test ## 建立並切換到新分支
git checkout master ## 切換到master分支
git checkout commitid ## 檢出到指定commitID

分支的更名

git branch -m master master2 ##修改分支master爲master2

問題:有修改完的代碼:如何切換分支。

如何完成臨時保存?

##保存現場
git stash ## 保存當前工做區的全部修改。
git stash save 'message' ##保存到臨時保存去。而且加註釋
git stash list ## 查看保存區的臨時修改
##恢復現場
git stash pop ##將上次的臨時保存的工做區取出來,而且將臨時保存的分支給刪除掉
git stash apply ##將臨時工做區的內容取出來,可是不刪除臨時保存的分支
git stash drop stash@{0} ## 刪除指定的保存區的存儲內容

標籤與diff

標籤的基本使用

標籤不依賴於分支

輕量級標籤

git tag v1.0.1  ## 建立輕量級標籤

建立一個帶有標註性的標籤

git tag -a v1.0.2 -m 'desc message' ##建立帶有註釋的標籤

查看版本庫中的全部標籤

git tag 
git tag -l 'v1,0'
git tag -l '*2'
git tag -1 'v*'

刪除標籤

git tag -d v1.0.1

git blame 標籤的使用

顯示上一次對文件修改的做者信息和時間等

git blame <file>

diff標籤的使用 (差別性查詢)

1.先介紹 Mac自帶的diff 比對命令

diff ## 系統自帶的命令
diff a b ## 比較文件a 和 b的區別
diff -u a b ## 詳細的介紹a和b的區別

diff 屬性介紹

--- 原始文件

+++ 目標文件

@@-1,3  +1,3 @@

` ` Hello world ## 沒有符號表示兩個文件都有的

`-` 表示第一個文件須要刪除這一行 就能夠生成a

`+`表示第一個文件須要添加的這一行 就能夠生成b

因此:- 表明第一行,+ 表明第二行

git diff 命令詳解

git diff  ## 默認比較:暫存區和工做區的差異
git diff commit_id ## 工做區和特定的commit_id的差異
git diff HEAD ## 工做區與當前分支的最新提交的代碼的比較
git diff --cached ## 暫存區和版本庫中的比較
git diff --cached commit_id ## 暫存區和版本庫中指定版本的比較

也許你如今用以爲學這些沒有用,可是是否是瞭解了這些多的東西,是否是更能擴大你的思惟呢?

你以爲沒用,多是由於你沒有見過實際的服務器環境

遠程與GitHub

  • push 推送

  • pull 拉取,同時會執行合併merge

    • pull ==fetch + merge :先拉取,再合併

遠程版本庫:GitHub

內網遠程版本庫:GitLab

GitHub

官網:https://github.com/

介紹:開源的社交平臺。免費免費使用,代碼須要開源。

推薦:學習好使用GitHub以後,就會發現新的世界

git remote add origin ip.... ## 添加遠程地址
git push -u orgin master ## 將本地的master提到遠端, 而且 -u 是master與倉庫裏的關聯

遠程分支:origin

git branch -a ## 查看分支(包括遠端分支)
git branch -av ## 查看分支並顯示最後一次commitID

分支,指針,指向commit地址

git status 能夠查看當前分支和遠端分支的版本對比

本地不能直接對遠端分支進行操做,若是切換到遠端分支,就是對遠端分支所指向的commit點來顯示給你。

拉取遠程倉庫地址:

git clone ...地址
git clone ...地址  新項目名

fast forward : 快進

​ 快進是沒有衝突的時候的一種狀態

git add的三個功能:

  1. 將未追蹤的文件歸入緩存區
  2. 將已經被追蹤的,修改後的文件,歸入緩存區當中
  3. 衝突修改完畢以後,使用add 來標記你的衝突已經被解決掉了

衝突解決步驟:

  1. 拉取代碼的時候出現衝突
  2. 去修改衝突文件
  3. 使用add指令,標記已經修改衝突完畢
  4. 使用commit指令,推送你以前的提交和這次commit時候的合併衝突(因此commit完畢以後比master分支要ahead 2個分支)

vi命令:

dd  ## 刪除一行

:2,4d  ## 刪除2-4行

vi操做
1.跳到文本的最後一行:按「G」,即「shift+g」
2.跳到最後一行的最後一個字符 : 先重複1的操做即按「G」,以後按「$」鍵,即「shift+4」。
3.跳到第一行的第一個字符:先按兩次「g」,
4.跳轉到當前行的第一個字符:在當前行按「0」。

GUI(在熟悉Git命令和參數以前,儘可能不要使用GUI)

GUI(圖形工具)

Gitk(圖形工具)

GItHub Desktop (圖形工具)

Git合併原則:Git遵循着一個三方合併的原則

CommitID的生成策略是:SHA1

Git別名:

本質:字符串的替代

git config --global alias.br branch ## 使用br代替 branch
存在 ~/.gitconfig 文件裏面

經常使用的:
git config --global alias.st status
git config --global alias.co checkout
git config --global alias.unstage 'reset HEAD'
git config --global alias.ui '!gitk' ## 調用外部命令

git refspec

refspec 本質:本地的分支和遠程分支上的對應關係

建立遠端分支
新版本
git push --set-upstream origin develop ## 將本地的分支推送到遠程,而且創建對應關係

舊版本:
git push -u origin test ## 將本地的推送到遠程,而且創建對應關係

建立本地分支和遠端分支名字不一樣的分支
git push --set-upstream origin develop:develop2 ## 源分支:遠端分支
上述分支創完遠端分支以後,本地分支不能直接push到遠端分支那個上面
(建議同名)。
git push origin HEAD:develop2
關聯遠端分支
新版本
git checkout -b develop origin/develop ## 建立一個develop分支追蹤遠端的develop分支

舊版本:
git checkout --track origin/develop ## 建立一個develop分支追蹤遠端的develop分支
刪除遠端分支
舊版本:
git push origin :develop ## 推送一個空的分支到遠端分支。
 
新版本:
git push origin --delete develop ## 刪除遠端分支

幾個重要的點:

git push 的完整寫法:git push origin srcBranch:destBranch

pull 操做的完整命令:git pull origin srcBranch:destBranch

HEAD標記:HEAD文件是一個指向你當前所在分支的引用標識符,該文件內部並不包含SHA1值,而是一個指向另一個引用的指針

當執行git commit 命令時,Git會建立一個commit對象,而且將這個commit對象的parent指針設置爲HEAD所指向的引用的SHA-1值

咱們對於HEAD修改的任何操做,都會被reflog給記錄下來

查看遠程HEAD

vi .git/ORIG_HEAD ##查看遠程HEAD
vi .git/FETCH_HEAD ##查看拉取的HEAD

遠端分支重命名:只能先刪除遠端分支,而後從新推送遠端分支

本地分支:本地遠程分支:遠程倉庫的分支

Git的高級命令(咱們經常使用的全部命令都是高級命令)和底層命令(Git的基礎)

底層命令

git symbolic-ref HEAD  ## 讀取文件的底層命令
git symbolic-ref HEAD refs/heads/develop  ##

標籤和遠程標籤

在遠端倉庫中: released就是表明的標籤

git tag ## 查看全部的標籤
git tag v1.0 ##建立輕量級標籤
git tag -a v2.0 -m 'v2.0 released' ## 建立嗲註釋的標籤
git show v1.0 ##查看指定標籤的信息
git tag -l '?2*' ##模糊查詢標籤

將標籤推到遠程倉庫

git push ## 默認不會推送標籤,只會推送分支
git push origin v1.0 ##推送指定標籤到遠程
git push origin v1.0 v2.0 v3.0 ##批量推送指定標籤
git push origin --tags ## 一次性推送全部的標籤 

推送標籤的完整語法
git push origin refs/tags/v7.0:refs/tags/v7.0

獲取遠程標籤

git pull ##拉取的時候會獲取全部的標籤

拉取指定標籤
git fetch origin tag v7.0 ## 拉取指定的標籤

刪除遠端標籤

1. 在遠端倉庫直接點擊刪除按鈕。
2. 推送一個空的源標籤推送到遠程,就刪除了。(方法和分支相似)

git push origin :refs/tags/v6.0  ##經過本地命令刪除遠端標籤
git push origin --delete tag v5.0 ## 方法2:經過本地命令刪除遠端標籤

git tag -d v5.0 ##刪除本地tag標籤
  1. 在缺省狀況下,refspec會被git remote add 命令所自動生成。Git會獲取遠端上refs/heads下的全部引用,而且將他們寫到本地的refs/remotes/origin目錄下,因此若是遠端上有一個master分支。能夠經過如下方式去查詢遠端分支的歷史記錄。

    - git log 
    - git log origin/master
    - git log remotes/origin/master
    - git log refs/remotes/origin/master (最全面的寫法)

.config文件裏面的信息

git fetch = +refs/  ## 這個加號,若是加上是 就算不能快進也能夠拉取代碼

refs文件 (refspec的縮寫),存放的是全部遠端分支

關於已經被刪除的分支

A 在本地刪除遠端分支,B 在本地的遠端分支還在

B這個時候拉取是不行的,會提示 沒法拉取原單分支。

git remote prune  ## (裁剪:刪除本地多餘的 遠端分支)

Git gc

git gc會用的不多,大部分會在底層自動執行

做用:打包,壓縮 ,對對象進行壓縮

手動執行以後的效果:目錄下的refs文件就會都不見了(被壓縮到 packed refs文件裏面了)

Objects/ 目錄:就是每次壓縮的時候所存放的目錄

關於Git的全部操做和文件,都存放在.git的目錄裏面


覆盤已經學習的

關於刪除

使用 git rm 刪除文件,包括本地和Git跟蹤

使用git rm --cached 刪除緩存區的文件,不刪除本地文件

刪除遠端倉庫

git remote rm origin ##

git remote show origin ##展現遠端倉庫信息

關於重命名

關於重命名文件

使用 git mv hello.txt hello2.txt

至關於:

1. mv hello.txt hello.txt
2. git rm hello.txt
3. git add hello2.txt

關於重命名遠程倉庫

git remote rename origin origin2

Git裸庫與submodule

Git裸庫

Git 裸庫: 沒有工做區的倉庫(通常在服務器端使用Git裸庫)

建立裸庫:git init --bare

Submodule 子模塊

出現的原因:開發項目的時候,這個項目依賴於其餘項目。須要把子項目的源碼也依賴到當前開發的項目當中

添加子模塊

git submodule add 子模塊的地址 mymodule ## 拉取子模塊的代碼到 mymodule文件中

添加完以後會自動生成兩個文件: .gitmodules 和 mymodule文件夾

此時兩個文件就已經相互包含了。在GitHub倉庫裏面也可以識別。

父項目獲取子模塊的最新代碼

  1. 進入子模塊的目錄,執行git pull
  2. 直接在父目錄,執行git submodule foreach git pull

子模塊修改以後,須要在父模塊進行提交子模塊的修改

其餘人如何克隆

方法一:

  1. 在使用git clone直接克隆父模塊的時候,子模塊是空的
  2. 使用git submodule init進行初始化
  3. 遞歸更新 git submodule update --recursive
  4. 就OK了。子模塊的內容就拉取下來了。

方法二:

使用 git clone 倉庫地址 存放地址 --recursive 一步完成

刪除子模塊

  1. 沒有提供直接的命令去刪除。本身使用基本命令去完成。
  2. 刪除暫存區的內容 git rm --cached mymodule
  3. 刪除存在的文件rm -rf mymodule
  4. 執行commit~
  5. 刪除沒用的 .gitmodule 文件 (步驟同上)
  6. 刪除沒用的配置文件(步驟同上)

Git subtree

使用git subtree查詢subtree的使用幫助文檔

功能和以前介紹的git submodule同樣,可是submodule存在着很致命的弊端。在主工程中修改子工程的代碼。可能會形成不少不少的問題。submodule也沒有提供刪除操做。因此在後續版本中添加了git subtree

git subtree的使用也比較簡單,也很容易的實現父模塊和子模塊的雙向修改。官方推薦使用subtree替換submodule.

如何使用

  1. 準備兩個倉庫,父模塊和子模塊

  2. 添加一個新的遠程庫。(subtree-origin)

  3. 添加子模塊到父模塊:

    git subtree add --prefix=subtree subtree-origin master --squash
    #功能描述:添加遠端倉庫`subtree-origin` 的`master分支`到本項目的 `subtree`目錄下
    #PS:`--squash `合併壓縮以前的全部commit爲一個。

subtree和submodule的區別
submodule是使用指針指向子模塊的目錄

subtree是將代碼真真正正的放在父模塊中

修改子模塊以後如何更新

git subtree pull --prefix=subtree subtree-origin master --squash

在父模塊修改完子模塊以後,如何同時提交兩個倉庫

  1. 若是使用git push默認只是推送父模塊一個項目
  2. 使用git subtree psh --prefix=subtree subtree-origin master 推送子模塊

遇到問題:最好深刻底層的去了解爲何會發生這樣的問題,而後解決。

備註:git push --set-upstream origin master 推送當前分支到遠端分支

或者:git push -u origin master 推送當前分支到遠端分支

vi操做
1.跳到文本的最後一行:按「G」,即「shift+g」
2.跳到最後一行的最後一個字符 : 先重複1的操做即按「G」,以後按「$」鍵,即「shift+4」。
3.跳到第一行的第一個字符:先按兩次「g」,
4.跳轉到當前行的第一個字符:在當前行按「0」。

深刻Git subtree的底層

添加subtree

git subtree add -P subtree subtree-origin master --squash
git subtree add --prefix subtree subtree-origin master --squash
git subttee add --prefix=subtree subtree-origin master --squash

#上述三種方式等價 	 使用 git subtree查看幫助可以看的到

在子模塊修改subtree以後,在父模塊獲取

(注意:squash 要使用的全局都使用)

git subtree pull -P subtree subtree-origin master --squash

在父模塊修改subtree以後,在父模塊提交substree

git subtree push -P subtree subtree-origin master

直接push全部的內容到父模塊

git push

父模塊提交過以後,在子模塊修改,再在父模塊拉取代碼,就會出現衝突

從理解上,應該不會衝突。可是產生衝突了

使用 git status查看衝突位置

解決衝突,上傳。可是會提示什麼都沒有修改

這時候再去修改subtree項目的文件,push

而後再去父模塊拉取代碼,此次就會成功了。

問題:爲何有時候會出現衝突?有時候不會出現衝突?

根本緣由還在:squash這個參數。

由於使用了squash,致使三方合併的commit記錄尋找不到。因此就會出現衝突

可是:squash 不論用不用,在子模塊修改完第二次以後,在父模塊修改的第一pull就會出現問題。

因此:要麼全程都使用squash,要麼全程都不使用squash

**substree spilt **

拆分子模塊 git substree spilt 以前裏面攜帶的commit記錄,也會攜帶出來

用的很少,也有不少不方便的地方。好比:同時修改了子模塊和父模塊,是沒辦法區分子模塊的

squash 參數詳解

--squash合併壓縮以前的全部commit爲一個。

合併壓縮以前的全部commit爲一個提交。(以前的每一個commit記錄都會消失)

主倉庫中是看不到squash以前的commit的,因此容易致使出現修改子模塊的時候出現問題。

做用:防止subtree的commit記錄污染了父模塊的記錄

引發的問題: 合併commit記錄以後,致使三方合併不可以正常進行

爲何使用和不用squash均可能會衝突?(使用圖形化界面能夠合理的看出來緣由)

  1. 找到衝突的根本緣由(合併的時候沒有共同的祖先)

    image-20200119065416851

    三方合併的時候,雖然A B 有一個共同祖先,可是A的上面還有一個祖先。

    往上追溯的時候,會發現他們的根本根源是沒有交集的。因此在合併的時候不知足三方合併,因此就可能出現衝突。

總結:若是一開始就是用了squash的話,請一直使用,若是不使用的話,就都不要使用。

學習重要且常見的命令和參數

對於技術的理解越深刻,你對其餘技術的瞭解學習的也就越快

張龍老師應該是全網目前將的最系統,最深刻,最完整的課程

Git會伴隨你的開發生涯。

Git cherry-pick

功能描述:將這個分支上的commit記錄,應用到另一個分支上。很簡單可是頗有用。

如:develop改了c1,c2, 可是c1 c2 應該上master的。最笨的辦法就是手動拷貝出來,而後刪除本地的提交,提交在其餘地方。

cherry-pick就是爲了解決這種問題而存在的。

主要應用在本地分支上。

語法:

git cherry-pick commitid  ## 將指定的commitID的記錄,放入到當前分支上。

若是有兩個commitid,是否可以直接只截取最後一條,而不是按照以前commit的順序去提交?

能夠,可是會衝突。正常解決衝突就行了。

若是按照順序,就不會用衝突。

在源分支上的 commit,仍是存在的。 使用 checkout去恢復。

充分利用Git提供的解決方案去解決咱們的問題

Git rebase原理深度剖析

rebase:變基 (衍合):改變分支的根基

要完成的功能相似於merge的功能,從某種程度上結果相同,可是執行原理徹底不一樣。

image-20200119161128340

在A分支上,執行git rebase B 效果圖如上

注意:

  1. rebase過程當中也會出現衝突
  2. 解決衝突以後,使用git add添加,而後執行 git rebase --continue
  3. 接下來Git會繼續應用餘下的補丁。
  4. 任什麼時候候均可以經過git rebase -- abort命令終止rebase,分支會恢復到rebase到開始前的狀態

rebase的最佳實踐

  1. 不要對master分支執行rebase,不然會引發不少問題

  2. 通常來講,執行rebase的分支都是本身的本地分支,沒有推送到遠程版本庫

    由於若是你已經上傳,絕對不要使用git rebase,別人可能已經拉取了你的分支。歷史應該是快照,不該該被修改。

    rebase是會修改歷史記錄的。

    若是已經合併到遠程,請老老實實的使用git merge合併就行。

rebase是先將要變基的內容,以補丁的形式打包。而後添加到指定基礎的分支的後面。

在執行git gc的時候,會清理掉補丁。 補丁存放在rebase-apply 目錄下

在出現衝突的時候

  1. 使用 git rebase --skip : 丟棄到當前的補丁:是以 目標分支爲準。跳過沖突的部分
  2. 使用 git rebase --abort: 是取消掉全部的rebase操做。恢復最開始的分支

Git merge:歷史發生,就不能修改

Git rebase:歷史能夠被修改,只顯示最好的

因此:視狀況而定,因人而異

Intellij IDEA使用詳解

  1. 收費,不要去推廣盜版和破解版
  2. 官網 還有不少其餘好用的工具
  3. 本身使用,熟能生巧

構建基於Gradle的工程

基於groove的腳本語言來編寫和配置的

優點:兼容Maven

官網

1.下載 2.配置

文檔:很好,涉及了方方面面 點擊跳轉

DSL:領域特定語言。須要對groove語言有所瞭解

應用:

  1. 新建項目
  2. 配置文件的語法
  3. 如何使用私服倉庫
  4. 如何添加依賴jar包
  5. jar包存放位置: ~/gradle
  6. gradle命令
  7. groove語法
  8. Gretty插件(自帶Tomcat插件,jetty,熱部署等)

Gradle Web工程與Gretty詳解

  1. 自行研究一下 gretty (github )
  2. 基本使用
  3. gretty的配置
  4. 遠程調試的概念和使用 (Java調試架構,Tomcat的底層也是Java調試架構)idea-remote
  5. Java的調試架構 (也能夠支持遠程調試) 代碼和運行環境不在同一臺機器上的狀況下使用

不要將本身的目光放在你當前的項目組,放眼去望。不要閉門造車

Git、Intellij IDEA與Gradle的整合

  1. 現成的工程(gradle工程)
  2. 明確哪些須要放入git,哪些不須要放入git
  3. build.gradle / setting.gradle / src目錄 ,只有這三個須要放進去
  4. 建議 .gitignore

阿里雲ECS詳解

ESC(彈性計算服務)

github 服務器在國外,相對慢

gitlab 安裝在Linux上面。 阿里雲ECS(彈性計算服務)雲服務

不少不少的創業型公司,都在使用雲服務器,都不會去購買本身的服務器。由於便宜。

官網:www.aliyun.com

購買雲服務器

SSH - 鏈接購買的 Linux系統,(centOS 7 )

Linux服務器的使用

命令操做

Linux學,不要怕,去積累,慢慢學。沒別的辦法。

GitLab安裝與部署以及疑難問題解析

Gitlab官網

國內大部分公司都在使用GitLab來託管代碼

GitLabCE 社區版 (大部分使用這個)

GitLabEE 企業版

  1. 下載安裝 ()
  • 安裝和配置必要的依賴

    • 反向代理
    • Redis
    • 郵件系統(Postfix, Sendmail)
    • curl
    • openssh
  • 開啓防火牆 HTTP/SSH (在ESC上可能會出現防火牆的問題)

  • 執行腳本的時候,下載GitLab源的時候就會出問題。(須要手動下載rpm文件-對應centos7)

  • 而後經過 scp 的方式,將本地下載的GItLab包上傳到阿里雲的ECS上

    • 經過命令,再進行安裝
    • 配置重啓 GitLab
    • 修改必要的配置:默認的HTTP的地址,不是IP地址也不是域名地址。

    由於中國GMW禁用。

    GitLab是Ruby語言寫的

  • 訪問IP登陸。 設置登陸限制,是否容許註冊等等。

  • 通常內網是不容許本身註冊的。

  • GitLab的功能是很是很是強大的。(項目,用戶,組的管理)

GitLab使用詳解

  1. 項目放在Group當中,方便管理
  2. 其餘操做和GitHub相同
  3. 須要本身搭建一個倉庫
  4. 而後去操做。
  5. wiki
  6. 持續集成 Jenkins組件搭配
  7. Graphs等

Git 回顧總結

30多講和周邊內容的介紹和學習,成爲了一個能使用Git進行平常開發和託管-合格的使用人員

本地操做 - 命令行

add mv rm 基本操做

.gitignore 忽略文件

git branch :檢出,合併,切換,推拉

git stash:暫存

git remote操做

github

遠程協做模型、分支最佳實踐

別名,alias設定

GUI工具,git gui, gitk

git refspec : push pull 分支映射的一些操做

.git目錄下的文件和做用

git gc

git裸庫,submodule ,subtree

git cherry-pick

git rebase

idea

greadle/getty

git/idea/gradle

ECS

gitlab

markdown

gitbook.com (電子書出版領域的標準) Word是最low的方式

自我Git命令彙總

記錄本身可以用到的功能的命令

git init  ## 初始化倉庫
git remote add origin address ##建立遠端地址
git remote remove name ## 刪除遠端地址
git commit -m 'message' ## 提交一次commit
git rm test.txt  #刪除一個已經存到緩存區的文件
git add .  ## 提交一次修改
git reset HEAD test.txt  ## 將已經保存到暫存區的內容撤回到工做空間
git branch develop ##建立分支
git checkout develop ##切換分支
git checkout -b new_dev ##建立並切換到Dev
git checkout - ##切換到上一次所在的分支	
git config alias.co 'checkout' ## 定義別名
git merge branchname ## 合併指定分支到當前分支
git stash ##將暫時修改未提交的內容,暫存到一個分支
git stash pop ##返回上次暫存的一些內容
git checkout -- test.txt ##將指定文件返回到最初始未修改的狀態
git tag ##查看標籤
git tag v1.0 ##建立標籤
git tag -d v1.0 ##刪除指定標籤
git checkout v1.0 ##切換到指定標籤
git blame <file> ##查看指定文件的修改人員信息詳情

.gitignore 文件的配置規則

gitbook的使用

相關文章
相關標籤/搜索