一碉纳、基本操作
-
將當前目錄初始化一個git倉庫
git init
-
將文件快照放入暫存區(qū)域
git add 文件
-
提交更新适室,找到暫存區(qū)域的文件嫡意,將快照永久存儲到git倉庫
git commit -m "提交信息,建議寫有意義的詳細信息,方便從歷史記錄中找到改動記錄"
可以多次git add 不同文件捣辆,commit一次將暫存區(qū)所有修改提交 -
查看倉庫當前狀態(tài)
git status
下面的命令輸出告訴我們蔬螟,demo.txt被修改過,但未提交
$ git status
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: demo.txt
no changes added to commit (use "git add" and/or "git commit -a")
-
查看修改的內(nèi)容
git diff 文件
-
查看提交日志
git log
如果看的眼花繚亂汽畴,可以加上--pretty=oneline
-
回退到某一版本
git reset --hard 某一版本
回退到往上100個版本
HEAD
表示當前版本
HEAD^
表示上一個版本
HEAD^^
表示上上一個版本
HEAD~100
表示往上100個版本 -
回到之前最新版本
git reset --hard 版本id
id越長越好旧巾,不然容易找到多個版本號- 在命令行窗口還沒關(guān)閉的情況下耸序,找到那一版本的commit id(一串十六進制)
- Git提供了一個命令記錄你的每一次命令
git reflog
可以從中找到對應(yīng)commit id
-
撤銷修改
git checkout -- 文件
回退到最近一次git commit
或git add
時的狀態(tài)
命令中--
很重要,沒有就變成“切換到另一個分支” -
撤銷暫存區(qū)的文件鲁猩,重新放回工作區(qū)
git reset HEAD 文件
-
刪除文件
git rm 文件
- 第一種情況
git rm
并且git commit
將刪除版本庫的文件坎怪。 - 第二種情況
git checkout -- 文件
將被刪除的文件恢復(fù)到最新版本。
- 第一種情況
二廓握、遠程倉庫
-
創(chuàng)建SSH Key
ssh-keygen -t rsa -C "郵箱"
會在用戶主目錄下生成.ssh目錄
id_rsa
私鑰搅窿,不可泄露
id_rsa.pub
公鑰,可以告訴任何人 - 在GitLab上添加SSH密鑰(公鑰)
- 在GitLab中創(chuàng)建倉庫隙券,并復(fù)制倉庫的SSH格式的URL(注意不是地址欄的URL)
添加遠程倉庫
-
關(guān)聯(lián)遠程庫男应,在本地倉庫下運行命令
git remote add origin 倉庫URL
這里是GitLab倉庫的URL
其中origin
是遠程庫的名字,可以修改娱仔。 -
將本地庫內(nèi)容推送到遠程庫
git push -u 遠程庫名稱 master
??用git push命令沐飘,實際上是把當前分支master推送到遠程。
??由于遠程庫是空的牲迫,我們第一次推送master分支時耐朴,加上了-u參數(shù),Git不但會把本地的master分支內(nèi)容推送的遠程新的master分支恩溅,還會把本地的master分支和遠程的master分支關(guān)聯(lián)起來隔箍,在以后的推送或者拉取時就可以簡化命令。
??從現(xiàn)在起脚乡,只要本地作了提交蜒滩,就可以通過命令git push 遠程庫名稱 master
推送到GitLab
從遠程庫克隆
git clone 遠程倉庫的URL
//這樣本地倉庫就已經(jīng)將遠程倉庫項目克隆下來了。
三奶稠、分支管理
??因為創(chuàng)建俯艰、合并和刪除分支非常快锌订,所以Git鼓勵你使用分支完成某個任務(wù)竹握,合并后再刪掉分支,這和直接在master分支上工作效果是一樣的辆飘,但過程更安全啦辐。
-
創(chuàng)建并切換分支
git checkout -b 分支
git checkout
命令加上-b
表示創(chuàng)建并切換,相當于一下兩條命令
git branch 分支
git checkout 分支
查看當前分支
git branch
切換分支
git checkout 分支
合并指定分支到當前分支
git merge 指定分支
刪除分支
git branch -d 分支
-
解決沖突
修改dev分支后
$ git checkout master
Switched to branch 'master'
Your branch is ahead of 'origin/master' by 1 commit.
(use "git push" to publish your local commits)
//修改分支后蜈项,從分支切換到master時芹关,Git還會自動提示我們當前master分支比遠程的master分支要超前1個提交信殊。
如果此時再修改master分支內(nèi)容鬓催,合并時會提示沖突
$ git merge feature1
Auto-merging demo.txt
CONFLICT (content): Merge conflict in demo.txt
Automatic merge failed; fix conflicts and then commit the result.
//Git告訴我們腔寡,demo.txt文件存在沖突疼阔,必須手動解決沖突后再提交朽缴。
git status也可以告訴我們沖突的文件
在文件內(nèi)容中Git用<<<<<<<模暗,=======沟绪,>>>>>>>標記出不同分支的內(nèi)容
將沖突的內(nèi)容統(tǒng)一氧吐,解決沖突內(nèi)容后重新提交即可。
- 查看分支合并情況
git log --graph --pretty=oneline --abbrev-commit
git log --graph
查看分支合并圖
分支管理策略
??通常怀樟,合并分支時功偿,如果可能,Git會用Fast forward
模式漂佩,但這種模式下脖含,刪除分支后,會丟掉分支信息投蝉。
如果要強制禁用Fast forward
模式养葵,Git就會在merge時生成一個新的commit,這樣瘩缆,從分支歷史上就可以看出分支信息关拒。
- 禁用
Fast forward
模式,創(chuàng)建分支
git merge --no-ff -m "詳細合并信息" dev
BUG分支
??軟件開發(fā)中庸娱,bug就像家常便飯一樣着绊。有了bug就需要修復(fù),在Git中熟尉,由于分支是如此的強大归露,所以,每個bug都可以通過一個新的臨時分支來修復(fù)斤儿,修復(fù)后剧包,合并分支,然后將臨時分支刪除往果。
??當你接到一個修復(fù)一個代號101的bug的任務(wù)時疆液,很自然地,你想創(chuàng)建一個分支issue-101來修復(fù)它陕贮,但是堕油,當前正在dev上進行的工作還沒有提交。
??并不是你不想提交肮之,而是工作只進行到一半掉缺,還沒法提交,預(yù)計完成還需1天時間戈擒。但是眶明,必須在兩個小時內(nèi)修復(fù)該bug,怎么辦峦甩?
??幸好,Git還提供了一個stash
功能,可以把當前工作現(xiàn)場“儲藏”起來凯傲,等修改BUG以后恢復(fù)現(xiàn)場繼續(xù)工作:
-
將當前工作現(xiàn)場“儲藏”起來犬辰,等以后恢復(fù)現(xiàn)場繼續(xù)工作
git stash
現(xiàn)在用git status
查看工作區(qū),工作區(qū)就是干凈的(除非沒有被Git管理的文件) -
查看“儲藏”的工作現(xiàn)場
git stash list
-
恢復(fù)最近一次“儲藏”的工作現(xiàn)場
git stash apply
恢復(fù)指定工作現(xiàn)場冰单,通過git stash list
查看工作現(xiàn)場的序號幌缝,將(stash@{序號})追加到命令后面
注意,序號越靠后诫欠,說明儲藏的時間越長
這樣恢復(fù)后涵卵,stash內(nèi)容并不會刪除,需要手動刪除 -
刪除“儲藏”的工作現(xiàn)場
git stash drop
-
恢復(fù)并刪除“儲藏”的工作現(xiàn)場
git stash pop
-
master分支出現(xiàn)bug荒叼,說明dev同樣也存在轿偎,Git專門提供了命令,讓我們復(fù)制一個特定的提交到當前分支
git cherry-pick 特定的提交id
Feature分支
??軟件開發(fā)中被廓,總有無窮無盡的新的功能要不斷添加進來坏晦。
??添加一個新功能時,你肯定不希望因為一些實驗性質(zhì)的代碼嫁乘,把主分支搞亂了昆婿,所以,每添加一個新功能蜓斧,最好新建一個feature分支仓蛆,在上面開發(fā),完成后挎春,合并看疙,最后,刪除該feature分支搂蜓。
??如果在feature分支還沒有合并前狼荞,需要取消這個功能,刪除時會銷毀失敗帮碰,需要使用大寫的-D
參數(shù)強制刪除相味。
?? git branch -D 分支
多人協(xié)作
??當你從遠程倉庫克隆時,實際上Git自動把本地的master分支和遠程的master分支對應(yīng)起來了殉挽,并且丰涉,遠程倉庫的默認名稱是origin。
-
查看遠程庫的信息
git remote -v
-v
表示詳細信息 -
推送分支
git push 遠程庫名稱 本地分支名稱
-
抓取分支
git clone 遠程倉庫的URL
默認只能看到本地的master分支
如果要在dev分支上開發(fā)斯碌,就必須創(chuàng)建遠程origin的dev分支到本地
git checkout -b dev origin/dev
創(chuàng)建并且還dev分支一死,并將遠程庫origin/dev 弄下來
如果最新提交和你推送的提交有沖突,先用git pull
把最新提交抓下來傻唾,然后在本地合并投慈,解決沖突承耿,再提交。
//git pull 失敗
$ git pull
There is no tracking information for the current branch.
Please specify which branch you want to merge with.
See git-pull(1) for details.
git pull <remote> <branch>
If you wish to set tracking information for this branch you can do so with:
git branch --set-upstream-to=origin/<branch> dev
//原因是沒有指定本地dev分支與遠程origin/dev分支的鏈接伪煤,根據(jù)提示加袋,設(shè)置dev和origin/dev的鏈接
設(shè)置本地分支dev與遠程分支origin/dev的鏈接
git branch --set-upstream-to=origin/dev dev
多人協(xié)作工作模式
盡量將沖突在本地解決
- pull遠程庫內(nèi)容到本地先進行合并
- 如合并沖突,則解決沖突
- 如沒有沖突或解決后抱既,再commit 并push到遠程庫
四职烧、遇到的問題
- HTTP Basic: Access denied 錯誤
- 如果賬號密碼變動,使用
git config --system --unset credential.helper
重新輸入賬號密碼 - 如果第一條命令解決失敗防泵,使用
git config --global http.emptyAuth true
- 還可以進入 控制面板>>用戶賬號>>憑據(jù)管理器>>windows憑據(jù)>>普通憑據(jù) 蚀之,在里面找到git,可以編輯用戶密碼