Git應用開發學習
這,僅是我學習過程中記錄的筆記。確定了一個待研究的主題,對這個主題進行全方面的剖析。筆記是用來方便我回顧與學習的,歡迎大家與我進行交流溝通,共同成長。不止是技術。
一旦你會使用了Git,就再也不想使用SVN了。永遠也回不去了。
Mac上使用Git,肯定離不開對Mac上的操作。就要使用常用的Linux命令來進行操作。通過終端來進行操作。
學習Git一定要使用命令行的方式來學習。不要使用圖形界面來操作學習。會大大折扣的哦。
花了時間來學習一門東西。一定要得到自己想要喜歡的東西。
課程的內容
- Git官網
- 常見Linux命令介紹
- Git在各平台下的安裝與配置
- 分布式與集中式版本控制系統的差別
- 緩存區、工作區與Git提交
- 版本回退
- 修改與撤銷修改、文件的添加與刪除
- Git對象類型與索引
- Git分支branch
- 如何創建、切換與刪除分支
- Git分支在項目開發中的作用
- Git分支在工程化項目中的最佳實踐
- 分支常見重要命令詳解
- Git merage
- Git沖突解決策略
- HEAD詳解
- Git Commit修改詳解
- 遠程版本庫介紹
- 如何使用遠程版本庫
- Git puah 、pull、fetch使用與注意事項
- Git合並的基本原則
- Git別名、config文件詳解
- Git tag詳解
- 如何創建於推送tag
- Git feature分支詳解
- 合適應該使用submodule
- Git subtree詳解
- .gitignore的正確使用方式
- Git私服gitlab的搭建方法
- 使用gitlab作為版本控制服務器
- Gitlab的使用詳解
- 搭建idea的Java開發工具,基於gradle的開發環境
- Git與idea的整合
- gradle初步使用
- .gitignore最佳實踐
開發工具的准備。
-
Git官網。https://git-scm.com/ 下載Git
Git is a free and open source distributed version control system designed to handle everything from small to very large projects with speed and efficiency.
Git is easy to learn and has a tiny footprint with lightning fast performance. It outclasses SCM tools like Subversion, CVS, Perforce, and ClearCase with features like cheap local branching, convenient staging areas, and multiple workflows.
bash 系統自帶的終端。
zsh 增強版的bash
- on my zhs 的安裝
sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
- 常見的Linux命令介紹
常見的Linux命令介紹
創建一個文件: touch text.txt
復制一個文件: cp text.txt
查看一個文件: cat text.txt
修改文件的名字: mv text.txt text1.txt
刪除一個文件: rm text.txt
修改一個文件: vi text.txt :wq 保存退出。
Git入門指引
Git GitHub Gitlab
為什么要使用Git。
本地建立版本庫。本地版本控制。多主機異地協同工作。重寫提交說明。有后悔葯可以吃。更好的提交列表,比較好的差異比較。更完善的分支系統。速度快。
Git工作模式
git 基礎
直接記錄的快照,而非差異比較
近乎所有操作都在本地執行。
時刻保持數據的完整性。
多數操作僅添加數據。
文件的三種狀態。 已修改,已暫存(stage),已提交(commit)。
Git文件:以被版本庫管理的文件
已修改:在工作目錄修改Git文件
已暫存:對已修改的文件執行Git暫存操作,將文件存入暫存區。
已提交:將已暫存的文件執行Git提交操作,將文件存入版本庫。
Git的文件狀態
MAC上推薦的工具 homebrew
SSH:Secure Shell
Git常用命令
mkdir mygit 創建一個目錄
獲得版本庫
git init 初始化一個版本倉庫
git clone
查看信息
git help
git log 查看提交日志
git diff 比較文件在不同狀態下的區別
版本管理
git add 將已修改的文件添加到暫存區
git commit -m 提交修改
git rm 刪除版本庫中的特定文件
遠程協作
git pull 拉取代碼到本地
git push 推送代碼到遠端
其他常用命令
touch test.txt 新建一個文件
cat test.txt 查看這個文件
vi test.txt 修改這個文件
git status 查看當前分支文件的狀態
配置username && email**
對於user.name 與user.email來說,有三個地方可以設置
- etc/gitconfig (幾乎不常用) git config --system
- ~/.gitconfig(對於單個用戶的,常用) git config --global
- .git/config (針對於特定項目) git config --local
優先級 3>2>1
2020年01月16日09:17:33
Git 命令練習
git的刪除,添加,修改與日志
which vi 查看命令的目錄
⌃ a 光標去開頭
⌃ E 光標去結尾
ehco 'hellow world asd' > test.txt 修改內容, 重定向到文件中。等於修改了文件。
刪除-恢復操作
rm
git rm
使用 rm 和 git rm 的區別。
git rm : 1. 刪除了一個文件 2. 將被刪除的文件納入到暫存區.
若想恢復被刪除的文件,需要進行兩步操作。
a. git rest HEAD test2.txt 將待刪除的文件從暫存區恢復到工作區
b. git checkout -- test2.txt 將工作區中的修改丟棄掉
rm : 將文件刪除,這時,被刪除的問價並未被納入到暫存區
重命名操作
git mv oldname newname 重命名
mv oldname newname 重命名
git mv 和 mv 的卻別 相當於 rm 和 git rm 的區別。
修改commit注釋
git commit --amend -m '修改commit注釋' ; 把上次提交的commit記錄給修改了
git log -n ;查看最近幾條的日志
查看幫助文檔
git help log ; git log --help ; man git log
.gitignore 與 分支
.gitignore的作用:過濾不需要上傳的文件。
- *.a #忽略掉所有.a結尾的文件
- !lib.a # 但lib.a除外
- /TODO #僅僅忽略項目根目錄下的TODO文件,不包括subdir/TODO
- build/ # 忽略build/目錄下的所有文件
- doc/*.txt # 忽略doc/a.txt 但不包括 doc/b/a.txt
- /**/test.txt 忽略所有的test.txt
-- 2020年01月18日18:16:58
rm -rf file 刪除一個文件 或者一個文件包
echo 'hello world ' > test.txt 創建一個文件
分支的重要操作:
分支的本質到底是什么?
分支,一個commit 對象鏈,一條工作記錄線。
HEAD指向的是當前的分支
master指向提交
合並之后 是一個快照 Fast - forward
git branch : 查看分支
git branch new_branch : 創建一個分支
git checkout - : 切換到上一個分支
git checkout master : 切換到master分支
git branch -d erwa : 刪除erwa 分支 。 不能刪除當前分支;不能刪除未合並的分支。 要刪的話 需要 -D
git branch -D erwa: 不管分支合並了沒,直接刪除
git checkout -b erwa4 : 創建,並切換到erwa4分支
git merge erwa4: 將erwa4分支合並到當前分支
git branch -v : 顯示分支最近的修改信息
git log --graph : 查看圖形化的日志
git commit -am '第三次提交' : 修改之后 add 並且 commit
沖突時手動解決沖突
分支進階與版本回退
分支進階
fast-forward :
如果可能的話,合並分支時,Git會使用fast-forward模式
在這種模式下,刪除分支時,會丟掉分支信息
合並時加上--no -ff 參數,會禁用fast-forward快照模式。這樣會多出來一個commit ID
如 : git merge --no -ff dev
查看圖形化的日志 git log -graph
版本回退
git reset --hard HEAD^ : 回退一個版本
git reset --hard HEAD^^ : 回退兩個版本
git reset --hard HEAD~2 : 回退第二個提交
git reset --hard commit_id : 回退到某個commit_id
回到最新的提交怎么辦呢?
git reflog 查看操作日志。 然后再回退
checkout進階與stash操作
checkout進階
vi操作:
1.跳到文本的最后一行:按“G”,即“shift+g”
2.跳到最后一行的最后一個字符 : 先重復1的操作即按“G”,之后按“$”鍵,即“shift+4”。
3.跳到第一行的第一個字符:先按兩次“g”,
4.跳轉到當前行的第一個字符:在當前行按“0”。
git reset HEAD test.txt : 將添加到暫存區的內容從暫存區移除到工作區
git checkout --
git checkout master : 切換到master分支
git checkout -b test : 創建,並切換到test分支
git checkout 986d4a30a : 切換到當前分支的 某個log之前的狀態。 游離狀態
git branch -m test dev : 將test分支 名字修改成 dev
stash操作
適用場景,在當前分支開發,需要切換到其余分支。保存當前分支的現場。恢復現場等
git stash : 保存現場
git stash list : 查看保存現場
git stash apply :恢復現場( stash內容不刪除,需要通過git satsh drop stash@{0} 手動刪除)
git stash apply stash@{0}:恢復某個現場
git stash pop : 恢復現場(恢復的同時也將stash內容刪除)
標簽與diff
標簽
標簽的基本使用和作用
作用: 發布系統,或者到了一個歷程碑時,給當前項目打一個版本標簽
標簽有兩種: 輕量級標簽與帶有附注的標簽
git tag v1.0 : 創建一個輕量級標簽
git tag -a v1.1 -m '注釋' : 創建一個帶有附注的標簽
git tag :查看當前分支的標簽
git tag -l '1.0' : 根據條件查找當前的分支
git tag -d v1.0 : 刪除標簽
diff
diff 兩個文件之間的差異性比較
git blame test.txt : 查看此文件的修改不同
diff a b : 比較a b 兩個文件的不同 -- Unix自帶的diff的使用
diff -u a b : 更清楚的比較 a b
git diff : 比較 暫存區 和工作區的區別 ; 暫存區作為原始文件。 工作區作為目標文件。
git diff HEAD : 比較工作區與最新提交的差別
git diff commit_id : 比較工作區與commit_id 那次的差別
git diff --cached : 比較的是最新的提交與暫存區之間的差別
遠程與GitHub
git config --list : 查看當前git的配置
推送遠程版本庫:
git remote add origin https://github.com/584tiegan/gitlecture.git
git push -u origin master
Git遠程操作
git remote show : 查看當前代碼關聯的遠程倉庫
git remote show origin : 查看遠程倉庫的信息
- Gitflow 建議和參考。
- 基於Git分支的開發模型:
- master -- 生產發布分支。變化非常不頻繁的分支。
- hotfix -- 熱修分支。用於緊急修復的分支。
- test -- 測試分支。 供測試和產品等人員使用的分支,變化不是特別頻繁。
- develop -- 開發分支,頻繁變化的一個分支。
- feature -- 開發者分支。針對於單個的功能點。
使用SSH方式clone代碼和push pull
先獲取本地SSH
➜ ~ cd .ssh
➜ .ssh ls
known_hosts
➜ .ssh ssh-keygen -t rsa
➜ .ssh cat id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC/SmZ8VvFLJIRurSXRaCsSeOgGN0bqKFt/3Qdk6MVqywHJEoYXlKdy4/NM/eMcgnNdpDnQkB5TbUyTppbVeMfuKz4RBH3bCw9oL44ZGm0bXB6hJU1kpnMMpSVriN+Ssv8GqBO/Vd4oK5vEywQV2e/cAvkqtC6Vb5Duf84Ho9n/U1IlcQVmbWw02TMzkzDwZqDbDoVWQBJ4sFRjq6lOFfZGFRtfXrBPnTkCibDlAjg0s0j7/FOcQupy4r4fbkXr+D4925ummuXD+E0F5+HIUWqddFhWgfMcs5T+JY+vh8D0Gbm7Q4g8A1DfAOwIWqFlBiFErQtgqNOGy14rv9g5IP2Z erwa@erwa.local
之后再GitHub里配置一下SSH 就可以了
Git協作
Git協作的基本過程介紹:
A人員push到遠程倉庫,B人員pull到本地倉庫。AB進行了同步,可以進行同時開發。
push代碼前,要先pull代碼。
AB人員都有本地的版本庫。也有一個公共的遠程版本庫。
一個本地庫可以對應多個遠程倉庫。
git remote show : 查看遠程倉庫的信息
git remote show origin : 查看某個具體的遠程倉庫的信息。
➜ mygit git:(master) git remote show origin
Warning: Permanently added the RSA host key for IP address '140.82.114.3' to the list of known hosts.
- remote origin
Fetch URL: git@github.com:584tiegan/gitlecture.git
Push URL: git@github.com:584tiegan/gitlecture.git
HEAD branch: master
Remote branch:
master tracked
Local branch configured for 'git pull':
master merges with remote master
Local ref configured for 'git push':
master pushes to master (up to date)
git branch -a : 查看本地所有的分支,包括遠程分支。
git branch -av: 查看所有分支的最后一次提交內容
git checkout origin/master: 本地切換到遠端master時,不會支持修改。
git clone SSH地址/HTTPS地址: 克隆遠程倉庫的代碼
git clone SSH地址 mygit2 : 克隆代碼,代碼倉庫的名字設置為mygit2
git add 有三個作用:
- 將文件納入到緩存區
- 將已經被工作區的文件納入到緩存區
- 如果一個文件產生了沖突,沖突解決后,調用一下git add 。表示沖突已經被解決了。
vi操作:
1.跳到文本的最后一行:按“G”,即“shift+g”
2.跳到最后一行的最后一個字符 : 先重復1的操作即按“G”,之后按“$”鍵,即“shift+4”。
3.跳到第一行的第一個字符:先按兩次“g”,
4.跳轉到當前行的第一個字符:在當前行按“0”。:set number . 打開行號
:4d 刪除第四行
dd 刪除光標所在行
git fetch : 只拉取代碼,不merge
git pull : git fetch + git merge
git遠程分支,別名,gitk與git gui
一開始,千萬不要直接使用gui 。 推薦使用git命令的方式來操作。更能深入了解Git
在git倉庫中: gitk : 打開gitk圖形化界面。
雲梯。。。
Git合並的原則
Git合並遵循三方合並的原則
Git redspec
本地分支與遠端分支的對應關系
git 別名的操作:
git config --global alias.br branch : br 代替 branch
st status
co checkout
創建遠端的分支:
新分支推送遠端時,直接 git push 不可以。 要使用 git push --set-upstream origin dev
git push -u origin dev: 老版本的 推送本地的分支到遠程、 推薦使用--set-upstream origin dev
git push 的完整寫法: git push origin dev:dev2 將dev的內容推送到遠端的dev2的分支上
刪除遠端的分支:
-
git push origin :dev 將一個空分支推到遠端分支
-
git push origin --delete dev 刪除遠端的dev分支
修改遠端的分支名: 刪除遠端分支,重命名本地分支,推送本地分支。
git remote show origin :查看本地和遠程分支的關系
git remote prune origin : 清楚本地沒有的遠端分支。
git push 的完整寫法: git push origin dev:dev2 將dev的內容推送到遠端的dev2的分支上
git pull 操作的完整命令: git pull origin dev:dev2 dev 是遠端分支,dev2是本地分支
HEAD標記: HEAD文件是一個指向你當前所在分支的引用標識符,該文件內部並不包含SHA-1值(commit_id),而是包含一個指向另外一個引用的指針。
當執行git commit 命令時,git 會創建一個commit 對象,並且將這個commit對象的parent對象設置為HEAD所指向的引用的SHA-1值。
我們對於HEAD修改的任何操作,都會被reflog完整的記錄下來。
實際上,我們可以通過Git底層命令symbolic-ref來操作HEAD
將標簽推送到遠端
git show v1.0 : 查看本地的標簽
git tag -l '2' : 搜索
git push origin v1.0 : 推送標簽到遠端
git push origin v1.0 v2.0 : 推送兩個標簽到遠端
git push origin --tags : 推送全部標簽到遠端
git push origin :refs/tags/v2.0 : 刪除遠端的某個標簽
git push origin --delete tag v2.0 : 刪除遠端的某個分支
推送分支的完整語法: git push origin refs/tags/v2.0:refs/tags/v2.0
git fetch origin tag v7.0 : 拉取某個標簽
git 遠程分支的底層剖析
在缺省情況下,refspec會被git remote add命令自動生成,git 會獲取遠端上refs/heads下的所有引用,並將它們寫到本地的refs/remote/origin 目錄下。所以,如果遠端有一個master分支,你可以在本地通過下面幾種方式來訪問它們的歷史記錄:
- git log origin/master
- git log remotes/origin/master
- git log refs/remotes/origin/master
fetch = +reds/heads/* :refs/remotes/origin/*
➜ .git git:(dev) cat config
[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true
ignorecase = true
precomposeunicode = true
[remote "origin"]
url = git@github.com:584tiegan/gitlecture.git
fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
remote = origin
merge = refs/heads/master
[gui]
wmstate = normal
geometry = 854x447+744+398 181 201
[branch "dev"]
remote = origin
merge = refs/heads/dev
Git gc
Git 的垃圾回收機制
git gc
➜ .git git:(dev) cat packed-refs : 調用git gc 后,內容打包放在這里
git mv hello.txt hello.txt : 可以當做是重命名的操作。
git remote rename origin origin2 : 重命名遠程倉庫
Git裸庫與submodule
Git裸庫
作用: 只有一個遠程倉庫,沒有工作區。用來中轉開發者的代碼
git init --bare 創建一個裸庫
submodule
Git倉庫里再包含一層Git倉庫,便於遠程調用。
將一個Git倉庫引用到另外一個Git倉庫。git submodule add SSH地址 mymodule
引用之后,被引用的倉庫修改信息,本地的倉庫git pull 便可得到最新的信息。
git submodul foreach git pull : 一次性的更新本倉庫所有的引用倉庫
git clone SSH地址 : 第二個人重新引用clone副項目,之后需要重新初始化submodule
git clone SSH地址 --recurive :此方式克隆的項目,會把項目所有的引用都給下來下來。
submodul 的刪除步驟:
- git rm --cached mymodule
- rm -rf mymodule
- rm -rm .gitmodule
- git push
Git subtree
另外的一種倉庫引用倉庫,實現代碼的雙向傳遞
git remote add origin SSH地址 : 本地倉庫添加到遠程倉庫
使用subtree地址引用:
-
Git remote add subtree-origin SSH地址
-
git subtree add --prefix==subtree subtree-origin master :
(--squah)參數:--squah 參數 是否合並代碼,並且作者也是當前的作者。作用:防止被引用的倉庫的log污染當前的倉庫。如果使用了,就一直使用。如果不使用,就一直不要使用。不然會沖突。
git subtree pull --prefix==subtree subtree-origin master : 更新引用代碼。
git push 時,代碼不會更新到被引用的倉庫中。
git subtree push --prefix==subtree subtree-origin master : 推送代碼到被引用的倉庫中。
git subtree 深度剖析
--squah 參數,如果使用了,就一直使用。如果不使用,就一直不要使用。不然會沖突。
git subtree split : 分割git模塊
學習要沉下心來,不要浮躁。
Git cherry-pick
將本地分支的修改應用到另外的一個分支上
git cherry-pick commit_id : 將此commit_id的改動應用到當前的分支
出現沖突時,手動解決沖突。
移動后,記得刪除元分支上的不想要的commit記錄。
Git rebase
變基,衍合 。修改分支的根基
rebase的功能類似於merge
區別: merge不會修改歷史。rebase會修改分支提交的歷史。
git checkout test
git rebase dev : 將test的修改打補丁到dev上
rebase注意事項:
-
rebase過程中也會出現沖突。解決沖突后執行 git rebase - - continue
-
任何時候都可以終止rebase。分支恢復到rebase之前的狀態。 git rebase - - abort
-
不要對master分支執行rebase,否則會引起很多問題
-
一般來說,執行reabse的分支都是本地的分支,沒有推送到遠程版本庫
idea和gradle的使用
1. 搭建基於gradle的項目
2. gretty插件
內置Tomcat
3. Git、idea、gradle
Gitlab
Gitlab推薦安裝在Unix上
中小型公司不會自己買服務器,一般都放在雲服務器就夠用了
阿里雲ECS
ssh root@地址
課程回顧總結
常用命令的使用
Git分支的使用
Linux常用命令
Git緩存的功能
Git的工作區,暫存區,提交區
Git遠程操作的使用
Github的使用
Git協作模型的使用
Git分支使用策略介紹
Git別名操作
Git GUI使用
pull push 的使用
Git GC的介紹
Git subtree 和 Git subModule的使用
2020年01月20日17:31:26 結束學習。
工作不止,學習不止,生活不止。現實世界的軟件開發是復雜的,復雜性並不體現在具體的技術棧上。如Java,Spring,Docker,MySQL等等具體的技術是可以學習很快就熟練掌握的。軟件真正復雜的部分,往往是業務本身,比如航空公司的超售策略,在超售之后Remove乘客的策略等;比如亞馬遜的打折策略,物流策略等。