一河胎、Git
倉庫
倉庫分為本地倉庫和遠程倉庫,它們通過秘鑰
和遠程倉庫地址
來建立連接虎敦。
A. 創(chuàng)建秘鑰SSH KEY
(遠程倉庫:公鑰游岳,本地倉庫:私鑰)
$ ssh-keygen -t rsa -C "youremail@example.com"
- 若
Git
只管理GitHub
或GitLab
中的一個,直接用上述命令即可 - 執(zhí)行命令后原茅,會在
~/.ssh/
目錄下生成私鑰id-rsa
和公鑰id-rsa.pub
吭历。 - 若同時管理兩個,則需為其指定一下名稱擂橘。
$ ssh-keygen -t rsa -C "youremail@example.com" id_rsa_lab
$ ssh-keygen -t rsa -C "youremail@example.com" id_rsa_hub
B. 提示:若上述命令在普通cmd
界面執(zhí)行晌区,則可能會報錯:
- 針對該問題,其實
git
相關命令都在git bash
中執(zhí)行即可
- 或者自行添加環(huán)境變量:
1. 找到Git/usr/bin目錄下的ssh-keygen.exe
2. 如果找不到通贞,可以在計算機全局搜索
3. 屬性-->高級系統(tǒng)設置-->環(huán)境變量-->系統(tǒng)變量,
找到Path變量朗若,進行編輯,End到最后昌罩,輸入分號哭懈,
粘貼復制的ssh-keygen所在的路徑,保存茎用;
重新cmd遣总,執(zhí)行ssh-keygen,成功!
- 若只想在
cmd
中臨時使用轨功,可以在Git/usr/bin
目錄下直接執(zhí)行ssh-keygen
的命令
C. 關于Git
同時管理gitHub
和gitLab
的問題
-
1) 之前看到的文章中是這么解決的
【但個人覺得不太好用旭斥,搞了大半天沒搞定,果斷放棄】
-
2)
ssh-add
相關知識點
① 添加私鑰命令ssh-add id_rsa_lab
(原來的id_rsa
未執(zhí)行相關命令古涧,可用)
② 然后將對應公鑰添加到對應服務端(這個很簡單垂券,就不列了),相應github
和gitlab
即都可用了
③ 如果在使用shh-add
的時候提示Could not open a connection to your authentication agent.
在git bash
中執(zhí)行ssh-agent bash
④ 關于ssh-add
羡滑,這里有一篇文章貌似講的比較詳細菇爪,正確與否自行判斷
上述鏈接的提問:我的
repo
分別推送到github
算芯,gitcafe
。 正確添加了兩個公鑰私鑰之后凳宙,并命名為id_github
和id_gitcafe
熙揍,發(fā)現每次push
代碼 都必須重新ssh-add
上私鑰。將id_github
名改回默認的id_rsa
近速,就可以直接push
了诈嘿。但是gitcafe
被拒絕堪旧。有沒有辦法可以一次都設置上削葱,不需要每次ssh-add
私鑰的
3)
git remote add url
地址
① 本地新建工程(git init
),第一次push
前,需要先關聯遠程倉庫
② 執(zhí)行命令git remote add origin https://github.com.xxx.git
③ 命令行中的origin
可以改為其他的淳梦,類似別名吧
④ 第一次提交可使用-u
析砸,執(zhí)行git push -u origin dev
⑤-u
的作用:將會關聯到遠程的dev
(第一次指定哪個就是哪個)分支上,以后該工程就可以git push
不指定參數了4) 配置
user
相關信息:
即git log
顯示的提交者信息爆袍;常用的配成global
,不常用的到相關git
工程下設置局部local
的即可首繁。
所有的倉庫都有效的配置方式:
git config --global user.name '您的名稱'
git config --global user.email '您的Email'
只對當前倉庫有效
git config --local user.name '您的名稱'
git config --local user.email '您的Email'
二、 Git Bash
切換目錄失敗及修改默認啟動路徑
A. 目錄有空格陨囊,切換目錄失敗弦疮,如Program Files
提示找不到目錄:/d/Program
。進入d
盤查看蜘醋,發(fā)現如果目錄名中間有空格的時候胁塞,bash
默認是要加單引號的
注意,盤符前面要加上 / 压语,而且路徑名是可以不區(qū)分大小寫的啸罢,包括單引號里面的單詞。
B. 每次打開bash
胎食,進入的不是自己想要的工作空間扰才,每次都要切換就有點費時間了,所以我們要修改默認加載目錄厕怜。
具體步驟:
1衩匣、桌面找到Git Bash的快捷啟動圖標
2、把 –cd-to-home去掉
3粥航、把起始位置中的“%HOMEDRIVE%%HOMEPATH%”替換成你的工作空間
4琅捏、重新打開bash,你就發(fā)現當前目錄已經是你替換的目錄了躁锡。
三午绳、工作區(qū)與暫存區(qū)
如上圖,將文件存入到Git版本庫里映之,分兩步執(zhí)行:
① 用git add
命令將工作區(qū)的修改文件添加到暫存區(qū)拦焚;
commit
之前可以多次add
,
add file1, file2, file3;
add file4, file5;
已經add
的文件蜡坊,又作了修改,如file3
,
別的不需重新add
,add file3;
即可
git add -A
: 把倉庫內所有變更加入到暫存區(qū)
git add .
: 把當前目錄及子目錄下所有變更加入到暫存區(qū)
git add
后可以執(zhí)行git status
:查看變更情況
② 用git commit
命令將暫存區(qū)的所有修改內容提交到當前分支赎败;一旦事務提交之后秕衙,如果對工作區(qū)沒有做什么修改,那么工作區(qū)就是干凈的
四僵刮、Git命令
講到工作區(qū)据忘、暫存區(qū)、版本庫搞糕,那這里就順便了解下Git的相關命令吧
上面2步提到的命令 | file 表示某個文件 |
添加到暫存區(qū) | git add xx |
查看變更情況 | git status |
提交 | git commit -m "xxx" |
多次commit后勇吊,如何查看歷史版本呢 | log |
查看某個文件變更的所有commit | git log file |
顯示就近的n個commit | git log -n |
一行顯示commit(直接顯示,信息很多) | git log --oneline |
用圖顯示所有分支的歷史 | git log --oneline --graph --all |
某文件最后修改對應的commit | git blame file |
git diff: 比較 | -- |
比較某文件工作區(qū)和暫存區(qū)的差異 | git diff file |
比較某文件暫存區(qū)和HEAD的差異 | git diff --cached file |
比較某文件工作區(qū)和HEAD的差異 | git diff HEAD file |
比較工作區(qū)和暫存區(qū)的所有差異 | git diff |
比較暫存區(qū)和HEAD的所有差異 | git diff --cached |
比較任意兩個commit的差異 | git difftool 提交A 提交B |
文件還原 | |
把工作區(qū)指定文件恢復成和暫存區(qū)一樣 | git checkout file1 file2 |
把暫存區(qū)指定文件恢復成和HEAD一樣 | git reset file1 file2 |
--- | --- |
把暫存區(qū)和工作區(qū)所有文件恢復成HEAD | git reset --hard |
Git中窍仰,HEAD表示當前版本汉规,上個版本HEAD^,上上版本HEAD^^ |
100個版本寫100個^太多驹吮,寫成HEAD~100 |
把當前版本回退到上一個版本 | git reset --hard HEAD^ |
把當前版本回退到其他版本 | 可以按上面一次類推 |
回退到之前的版本后针史,原來較新的版本若沒未推送到遠端,則無法回到較新版本碟狞,除非知道commit-sha1 |
版本號無需寫全啄枕,前幾位就可,git會自動找族沃。當然不能只寫前一兩位频祝,找到太對,無法定位竭业。 |
將工程切換成指定commit-sha1版本 | git reset --hard commit-sha1 |
我們還可以給commit-sha1(太冗長)打上標簽tag |
不加commit-sha1的話默認當前版本 |
tag其他命令會在下方列出 | git tag 標簽名 commit-sha1 |
--- | --- |
上面提到的checkout是恢復文件 | 下面checkout是切換分支 |
切換到指定分支 | git checkout 某個分支 |
創(chuàng)建分支并切換到該分支 | git checkout -b 新分支 |
基于checkout和恢復文件同命令智润,易誤解 |
git2.23發(fā)布了 git switch來切換分支 |
創(chuàng)建并切換到新的dev分支 | git switch -c dev |
直接切換到已有的master分支 | git switch master |
講到切換分支,下面講下其他分支概念 | branch |
列出分支 |
|
查看當前工作在哪個分支 | git branch -v |
列出本地和遠端分支 | git branch -av |
列出遠端所有分支 | git branch -rv |
列出名稱符合某樣式的遠端分支 | git branch -rv -l '某樣式' |
新建分支 |
除了git checkout -b 新分支: |
基于當前分支創(chuàng)建新分支 | git branch 新分支 |
基于指定分支創(chuàng)建新分支 | git branch 新分支 已有分支 |
基于某個commit創(chuàng)建分支 | git branch 新分支 某個commit的id |
刪除本地分支 |
|
安全刪除本地某分支 | git branch -d 擬刪除分支 |
強行刪除本地某分支 | git branch -D 擬刪除分支 |
刪完本地分支未辆,說下刪除遠端分支 | |
刪除遠端origin已不存在的所有本地分支 | git remote prune orign |
刪除遠端分支① | git push remote --delete 遠端分支 |
刪除遠端分支② | git push remote :遠端分支 |
刪除已merge到master的所有本地分支:git branch --merged master | grep -v '^\*\ | master' | xargs -n 1 git branch -d
說到遠端窟绷,了解下本地和遠端的交互 | |
---|---|
當前工程對應的遠端工程 |
remote |
列出所有remote | git remote -v |
增加remote | git remote add remote的名稱 url地址 |
刪除remote | git remote remove remote的名稱 |
改變remote的名稱 | git remote rename 舊名稱 新名稱 |
遠端其他命令 |
|
把遠端所有分支標簽的變更都拉到本地 | git fetch remote名稱 |
fetch + merge = pull | git pull remote名稱 本地分支名 |
把本地分支push到遠端 | git push remote名稱 本地分支名 |
上面已經提過的刪除遠端分支 |
|
刪除遠端分支① | git push remote名稱 --delete 遠端分支 |
刪除遠端分支② | git push remote名稱 :遠端分支 |
從遠程倉庫克隆 |
git clone remote相關的url地址 |
標簽tag相關命令 | |
---|---|
添加標簽 | git tag -a version -m "注釋" |
提交標簽到遠端 | git push origin -tags |
刪除標簽 | git tag -d version |
刪除遠程標簽 | git push origin :refs/tags/version |
查看標簽 |
git tag 或git tag -l
|
最后再附加個命令
查看哪些文件沒被Git管控: git ls-files --others
五、分支管理
分支在實際中有什么用呢?假設你準備開發(fā)一個新功能,但是需要兩周才能完成胸完,第一周你寫了50%的代碼缸逃,如果立刻提交呈础,由于代碼還沒寫完,不完整的代碼庫會導致別人不能干活了。如果等代碼全部寫完再一次提交,又存在丟失每天進度的巨大風險辐棒。
上面命令中已提到過了創(chuàng)建分支、切換分支啥的,這節(jié)主要講講分支的集成漾根。
A. 分支合并:merge & rebase
① merge
|
|
---|---|
把A分支合到當前分支,并commit | git merge A分支 |
把A合到B泰涂,并commit | git merge A分支 B分支 |
git merge 和 git merge --no-ff的區(qū)別
通常,合并分支時辐怕,如果可能逼蒙,
Git
會用Fast forward
模式,但這種模式下寄疏,刪除分支后是牢,會丟掉分支信息。
如果要強制禁用Fast forward( --no-ff)
模式驳棱,Git
就會在merge
時生成一個新的commit
艘策,這樣,從分支歷史上就可以看出分支信息
② rebase
|
|
---|---|
把當前分支基于B分支做rebase朋蔫,以便把B分支合入到當前分支 | git rebase B分支 |
把A分支基于B分支做rebase,以便把B分支合入到A分支 | git rebase B分支 A分支 |
③ merge & rebase的區(qū)別是啥驯妄?合砂,貼下知乎上比較簡潔的答案
更多相關說法青扔,點擊上面鏈接,即可查看翩伪。
總之:盡量及時rebase上游分支缘屹,發(fā)現有沖突,merge
B. 分支策略:在實際開發(fā)中犁珠,我們應該按照幾個基本原則進行分支管理
- 首先互亮,
master
分支應該是非常穩(wěn)定的,也就是僅用來發(fā)布新版本炊昆,平時不能在上面干活; - 那在哪干活呢屏积?干活都在
dev
分支上磅甩,也就是說卷要,dev
分支是不穩(wěn)定的,到某個時候奕枝,比如1.0版本發(fā)布時瓶堕,再把dev
分支合并到master
上郎笆,在master
分支發(fā)布1.0版本; - 你和你的小伙伴們每個人都在
dev
分支上干活激捏,每個人都有自己的分支凄吏,時不時地往dev
分支上合并就可以了远舅。
所以图柏,團隊合作的分支看起來就像這樣:
C. 分支合并沖突
- ① 分支
feature1
的readme.md
里寫上Creating a new branch is quick & simple.
蚤吹,提交 - ② 分支
master
的readme.md
里寫上Creating a new branch is quick AND simple.
课梳,提交 - ③ 將
feature1
合并到master
- ④ 手動解決沖突后再提交
- ⑤ 多人合作時的沖突呢(push沖突)? 先用git pull把最新的提交提交拉下來跨算,然后椭懊,在本地合并,解決沖突背犯,再推送
D. Bug分支【加塞臨時任務的處理:stash
】
-
1.1
軟件開發(fā)中坏瘩,bug
就像家常便飯一樣倔矾。每個bug
都可以通過一個新的臨時分支來修復柱锹,修復后禁熏,合并分支,然后將臨時分支刪除胧华。 -
1.2
當你接到一個修復代號101
的bug
任務時宙彪,你可以創(chuàng)建一個分支issue-101
來修復它您访,但是,等等,當前正在dev
上進行的工作還沒有提交: -
1.3
工作只進行到一半享言,無法提交渗鬼,預計還需1天
時間譬胎。但必須在2h
內修復該bug
,咋辦偏化? -
Git提供了一個
stash
功能侦讨,可以把當前工作現場“儲藏”起來。 -
2.1
執(zhí)行命令git stash
然后你再通過命令git status
查看工作區(qū)骗污,它是干凈的沈条。 -
2.2
bug
修復完成后蜡歹,切換到dev
分支,并完成合并擅这,最后刪除issue-101
分支 -
2.3
把“儲藏”的工作現場恢復仲翎,執(zhí)行命令git stash pop
(pop = apply + drop
)
E. Feature分支【添加新功能】
- ① 軟件開發(fā)中铛漓,總有無窮無盡的新的功能要不斷添加進來
- ② 添加一個新功能時浓恶,你肯定不希望一些實驗性質的代碼,把主分支搞亂
- ③ 所以湿镀,一個新功能勉痴,最好建一個
feature
分支树肃,在上面開發(fā)胸嘴,完成后,合并乡话,最后驾讲,刪除該feature
分支 - ④ 合并前接到上級命令,由于某些原因颅停,新功能必須取消掠拳!
- ⑤ 雖然白干了溺欧,但是這個包含機密資料的分支還是必須就地銷毀
- ⑥ 執(zhí)行命令
git branch -D
強行刪除(-d
安全刪除應該會提醒刪除失敗)
六芥牌、 Git
提交時的忽略文件
A. 哪些文件不能上傳到git上壁拉?
① 類似Android Studio
自動生成的配置文件:不能上傳到git
上柏靶,否則的話屎蜓,如果你的同事下載下來,但是它的studio(gradle)
版本和你的不一樣辆苔,或者其他配置的各種路徑不一樣姑子,就需要重建項目测僵,嚴重的話捍靠,根本無法重建項目森逮,一片爆紅褒侧!網上的方法也解決不了谊迄。
② 保存了數據庫密碼或者什么不能上傳的文件......B. 忽略文件
.gitignore
的原則是:
① 忽略操作系統(tǒng)自動生成的文件统诺,比如縮略圖等粮呢;
② 忽略編譯生成的中間文件钞艇、可執(zhí)行文件等哩照,也就是如果一個文件是通過另一個文件自動生成的,那自動生成的文件就沒必要放進版本庫识藤,比如Java
編譯產生的.class
文件蹋岩;
③ 忽略你自己的帶有敏感信息的配置文件学少,比如存放口令的配置文件版确。C. 想知道忽略那些文件嗎,很簡單侵歇,找個大神的
github
惕虑,看看他的項目中怎么寫的磨镶,就ok了A彰āF晟紊遵!
/captures
# Built application files
*.apk
*.ap_
# Generated files
bin/
gen/
# Gradle files
.gradle/
/build
/*/build/
# Local configuration file (sdk path, etc)
local.properties
# Proguard folder generated by Eclipse
proguard/
# Log Files
*.log
# Eclipse project files
.classpath
.project
.settings/
# Intellij project files
*.iml
*.ipr
*.iws
.idea/
# System files
.DS_Store
七暗膜、GIT GUI
簡單使用
注意:個人建議使用命令行方式進行版本管理桦山,但是可以使用圖形化界面看本次代碼的改動醋旦,比較方便饲齐。
- 在所在項目,右鍵選擇
git gui
- 界面如下,如果會使用命令行滥搭,那么一看就明白了
- 配置
UTF-8:Edit-Options
:
-
Add commit push
很快完成闽坡,不用輸i
入命令
- 查看代碼對比
如果想要查看所有的改動歷史疾嗅,可以:
就可以看到所有的代碼改動歷史代承,而不用去網上看论悴。注意墓律,這里能看到所有人的改動哦V欢汀W瞎取!非常強大握恳!
- 設置和遠程倉庫關聯(如果從項目根目錄進入乡洼,則自動關聯匕坯,不用設置) 如果需要設置葛峻,選擇
remote-?Add
,參考如下:
- 新建項目礁遵,從遠程倉庫克隆 佣耐。右鍵選擇
git gui
:
選擇克隆已有版本庫: