Git使用小結

廖雪峰的Git教程

一河胎、Git倉庫

倉庫分為本地倉庫和遠程倉庫,它們通過秘鑰遠程倉庫地址來建立連接虎敦。

A. 創(chuàng)建秘鑰SSH KEY(遠程倉庫:公鑰游岳,本地倉庫:私鑰)

$ ssh-keygen -t rsa -C "youremail@example.com"
  • Git只管理GitHubGitLab中的一個,直接用上述命令即可
  • 執(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同時管理gitHubgitLab的問題

  • 1) 之前看到的文章中是這么解決的
    【但個人覺得不太好用旭斥,搞了大半天沒搞定,果斷放棄】
config

測試github
  • 2) ssh-add相關知識點
    ① 添加私鑰命令ssh-add id_rsa_lab (原來的id_rsa未執(zhí)行相關命令古涧,可用)
    ② 然后將對應公鑰添加到對應服務端(這個很簡單垂券,就不列了),相應githubgitlab即都可用了
    ③ 如果在使用shh-add的時候提示Could not open a connection to your authentication agent. git bash中執(zhí)行ssh-agent bash
    關于ssh-add羡滑,這里有一篇文章貌似講的比較詳細菇爪,正確與否自行判斷

上述鏈接的提問:我的repo 分別推送到github算芯,gitcafe。 正確添加了兩個公鑰私鑰之后凳宙,并命名為id_githubid_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胎食,進入的不是自己想要的工作空間扰才,每次都要切換就有點費時間了,所以我們要修改默認加載目錄厕怜。

a.png

具體步驟:

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 taggit 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. 分支合并沖突

  • ① 分支feature1readme.md里寫上Creating a new branch is quick & simple.蚤吹,提交
  • ② 分支masterreadme.md里寫上Creating a new branch is quick AND simple.课梳,提交
  • ③ 將feature1合并到master
  • ④ 手動解決沖突后再提交
  • 多人合作時的沖突呢(push沖突)? 先用git pull把最新的提交提交拉下來跨算,然后椭懊,在本地合并,解決沖突背犯,再推送

D. Bug分支【加塞臨時任務的處理:stash

  • 1.1 軟件開發(fā)中坏瘩,bug就像家常便飯一樣倔矾。每個bug都可以通過一個新的臨時分支來修復柱锹,修復后禁熏,合并分支,然后將臨時分支刪除胧华。
  • 1.2 當你接到一個修復代號101bug任務時宙彪,你可以創(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簡單使用

注意:個人建議使用命令行方式進行版本管理桦山,但是可以使用圖形化界面看本次代碼的改動醋旦,比較方便饲齐。

  1. 在所在項目,右鍵選擇git gui
  1. 界面如下,如果會使用命令行滥搭,那么一看就明白了
  1. 配置 UTF-8:Edit-Options:
  1. Add commit push很快完成闽坡,不用輸i入命令
  1. 查看代碼對比

如果想要查看所有的改動歷史疾嗅,可以:

就可以看到所有的代碼改動歷史代承,而不用去網上看论悴。注意墓律,這里能看到所有人的改動哦V欢汀W瞎取!非常強大握恳!

  1. 設置和遠程倉庫關聯(如果從項目根目錄進入乡洼,則自動關聯匕坯,不用設置) 如果需要設置葛峻,選擇remote-?Add,參考如下:
  1. 新建項目礁遵,從遠程倉庫克隆 佣耐。右鍵選擇git gui:

選擇克隆已有版本庫:

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市掖鱼,隨后出現的幾起案子援制,更是在濱河造成了極大的恐慌晨仑,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,542評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異答捕,居然都是意外死亡拱镐,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 92,822評論 3 394
  • 文/潘曉璐 我一進店門蜘欲,熙熙樓的掌柜王于貴愁眉苦臉地迎上來姥份,“玉大人年碘,你說我怎么就攤上這事盛泡。” “怎么了凯砍?”我有些...
    開封第一講書人閱讀 163,912評論 0 354
  • 文/不壞的土叔 我叫張陵悟衩,是天一觀的道長座泳。 經常有香客問我幕与,道長啦鸣,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,449評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮中狂,結果婚禮上胃榕,老公的妹妹穿的比我還像新娘。我一直安慰自己泉褐,他們只是感情好鸟蜡,可當我...
    茶點故事閱讀 67,500評論 6 392
  • 文/花漫 我一把揭開白布揉忘。 她就那樣靜靜地躺著泣矛,像睡著了一般禾蚕。 火紅的嫁衣襯著肌膚如雪换淆。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,370評論 1 302
  • 那天,我揣著相機與錄音县习,去河邊找鬼躁愿。 笑死彤钟,一個胖子當著我的面吹牛,可吹牛的內容都是我干的吠勘。 我是一名探鬼主播剧防,決...
    沈念sama閱讀 40,193評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼峭拘,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了辉饱?” 一聲冷哼從身側響起彭沼,我...
    開封第一講書人閱讀 39,074評論 0 276
  • 序言:老撾萬榮一對情侶失蹤姓惑,失蹤者是張志新(化名)和其女友劉穎按脚,沒想到半個月后辅搬,有當地人在樹林里發(fā)現了一具尸體堪遂,經...
    沈念sama閱讀 45,505評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡蚤氏,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,722評論 3 335
  • 正文 我和宋清朗相戀三年竿滨,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片毁葱。...
    茶點故事閱讀 39,841評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡倾剿,死狀恐怖前痘,靈堂內的尸體忽然破棺而出担忧,到底是詐尸還是另有隱情瓶盛,我是刑警寧澤示罗,帶...
    沈念sama閱讀 35,569評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站拌阴,受9級特大地震影響迟赃,放射性物質發(fā)生泄漏。R本人自食惡果不足惜剪撬,卻給世界環(huán)境...
    茶點故事閱讀 41,168評論 3 328
  • 文/蒙蒙 一残黑、第九天 我趴在偏房一處隱蔽的房頂上張望梨水。 院中可真熱鬧疫诽,春花似錦、人聲如沸雏亚。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽长踊。三九已至,卻和暖如春之斯,著一層夾襖步出監(jiān)牢的瞬間日杈,已是汗流浹背遣铝。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留莉擒,地道東北人酿炸。 一個月前我還...
    沈念sama閱讀 47,962評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像涨冀,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子鹿鳖,可洞房花燭夜當晚...
    茶點故事閱讀 44,781評論 2 354

推薦閱讀更多精彩內容

  • 這是我在學習Git的過程中所做的讀書筆記的相關總結扁眯,希望能對剛剛接觸Git或Github的小伙伴們帶來一點點幫助,...
    sonack閱讀 2,497評論 9 56
  • 正好最近在逛GitHub的時候看到了一個學習git的項目翅帜,點進去一看姻檀,寓教于樂,闖關類型+互動的類型十分的有趣涝滴,就...
    NJU陳自強閱讀 310評論 0 0
  • 還是老規(guī)矩绣版,這篇看完后,還是學不會git版本控制的歼疮,你來砍我 是兄弟就來砍我吧T映椤!韩脏! Git是分布式版本控制系統(tǒng)缩麸,...
    Zteen閱讀 3,170評論 0 6
  • 安裝: windows安裝git-- msysgit是windows版的git,下載單獨的.exe按照默認選項安裝...
    alceyp閱讀 694評論 0 0
  • 轉載自:http://www.open-open.com/lib/view/open1414396787325.h...
    Bbooo閱讀 416評論 0 3