版本控制
git本質(zhì)是一個(gè)分布式版本控制系統(tǒng),客戶端可以完成clone整個(gè)倉(cāng)庫(kù),然后進(jìn)行提交和修改。
倉(cāng)庫(kù)
遠(yuǎn)程倉(cāng)庫(kù)(remote):遠(yuǎn)程主倉(cāng)庫(kù)github;
本地倉(cāng)庫(kù)(respository/history):.git文件夾里還包括git自動(dòng)創(chuàng)建的master分支,并且將HEAD指針指向master分支。使用commit命令可以將暫存區(qū)中的文件添加到本地倉(cāng)庫(kù)中;
暫存區(qū)(Index/Stage):在使用git管理項(xiàng)目文件的時(shí)候,其本地的項(xiàng)目文件會(huì)多出一個(gè).git的文件夾,將這個(gè).git文件夾稱之為版本庫(kù)。其中.git文件夾中包含了兩個(gè)部分,一個(gè)是暫存區(qū)(Index或者Stage),顧名思義就是暫時(shí)存放文件的地方,通常使用add命令將工作區(qū)的文件添加到暫存區(qū)里;
工作區(qū):本地電腦存放項(xiàng)目文件的地方。
二、git add提交到暫存區(qū)、出錯(cuò)怎么辦?
提交流程為:
Workspace 工作區(qū)git statut 查看狀態(tài)git add .將所有修改加入暫存區(qū)git commit -m 'first commit'將代碼提交到本地倉(cāng)庫(kù)git push將本地倉(cāng)庫(kù)代碼更新到遠(yuǎn)程倉(cāng)庫(kù)Remote
場(chǎng)景1:
當(dāng)你改亂了暫存區(qū)某個(gè)文件的內(nèi)容,想直接丟棄暫存區(qū)的修改時(shí)
git checkout --<文件名>
場(chǎng)景2:
當(dāng)你不但改亂了暫存區(qū)某個(gè)文件的內(nèi)容,還添加到了本地倉(cāng)庫(kù)時(shí),想丟棄修改
第一步 git reset HEAD file
第二步 git checkout <文件名>
三、git commit提交到本地倉(cāng)庫(kù),出錯(cuò)怎么辦?
更改commit信息
git commit --amend -m ‘new message’
commit時(shí),遺漏提交部分更新,有兩種解決方案
方案一:再次commit,此時(shí),git上會(huì)出現(xiàn)兩次commit
git commit -m ‘message’
方案二:遺漏文件提交到之前commit上。–no-edit表示提交信息不會(huì)更改,在git上僅為一次提交
git add missed-file (missed-file 為遺漏提交文件)
git commit --amend --no-edit
3.提交錯(cuò)誤文件,回退到上一個(gè)commit版本,再commit
git reset
把暫存區(qū)的修改撤銷掉unstage,重新放回工作區(qū)
git reset HEAD <文件名>
git版本回退,回到到特定的commit_id版本,可以通過(guò)git log查看提交歷史,以便確認(rèn)要回退到哪個(gè)版本commit之后的即為ID
git reset --hard commit_id
將版本庫(kù)回退1個(gè)版本,不僅僅是將本地版本庫(kù)的頭指針全部重置到指定版本,也會(huì)重置暫存區(qū),并且會(huì)將工作區(qū)代碼也回退到這個(gè)版本
git reset --hard HEAD~1
修改版本庫(kù),保留暫存區(qū),保留工作區(qū)
將版本庫(kù)軟回退1個(gè)版本,軟回退表示將本地版本庫(kù)的頭指針全部重置到指定版本,且將這次提交之后的所有變更都移動(dòng)到暫存區(qū)。
git reset --soft HEAD~1
git revert
撤銷某次操作,此次操作之前和之后的commit和history會(huì)保留,并且把這次撤銷作為一次最新的提交
撤銷前一次commit
git revert HEAD
撤銷前2次commit
git revert HEAD^
撤銷指定的版本,撤銷也會(huì)作為一次提交進(jìn)行保存。
git revert commit
git revert是提交一個(gè)新的版本,將需要revert的版本的內(nèi)容再方向修改回去,版本遞增,不影響之前提交的內(nèi)容
git revert和git reset的區(qū)別
git revert是用一次新的commit來(lái)回滾之前的commit,git reset是直接刪除指定的commit。
在回滾這一操作上看,效果差不多。但是在日后繼續(xù)merge以前的老版本時(shí)有區(qū)別。因?yàn)間it revert是用一次逆向的commit“中和”之前的提交,因此日后合并老的branch時(shí),導(dǎo)致這部分改變不會(huì)再次出現(xiàn),但是git reset直接把某些commit在某個(gè)branch上刪除,因而和老的branch再次merge時(shí),這些被回滾的commit應(yīng)該還會(huì)被引入。
git reset?是把HEAD向后移動(dòng)了一下,而git revert是HEAD繼續(xù)前進(jìn),只是新的commit的內(nèi)容和要revert的內(nèi)容正好相反,能夠抵消要被revert的內(nèi)容。
新建本地倉(cāng)庫(kù)git init
克隆git clone <url>
提交所有g(shù)it add .
提交指定文件git add <file1> <file2>
提交文件夾中所有文件到暫存區(qū)git add [dir]
刪除工作區(qū)文件,并且刪除暫存區(qū)文件記錄git rm <file1> <file2>
刪除暫存區(qū)文件,工作區(qū)還存在git rm --cached <file>
取消暫存區(qū)已暫存文件git reset HEAD <file
撤銷上一次對(duì)文件的操作git checkout --<file>
添加緩存棧:?git stash?;
查看緩存棧:?git stash list?;
推出緩存棧:?git stash pop?;
取出最新緩存:git stash apply;
取出特定緩存內(nèi)容:?git stash apply stash@{1}
重命令文件,并將已改文件提交暫存區(qū):git mv <file-origin> [file-rename>;
查看當(dāng)前工作區(qū)所有文件的狀態(tài):?git status;
比較工作區(qū)中當(dāng)前文件和暫存區(qū)之間的差異,修改之后沒(méi)有暫存的內(nèi)容:`git diff``
查看提交歷史:git log;參數(shù)-p展開(kāi)每次提交的內(nèi)容差異,用-2顯示最近的兩次更新,如git log -p -2;
將暫存區(qū)中的文件提交到本地倉(cāng)庫(kù)中,即打上新版本:git commit -m “commit_info”;
將所有已經(jīng)使用git管理過(guò)的文件暫存后一并提交,跳過(guò)add到暫存區(qū)的過(guò)程:git commit -a -m “commit_info”;
提交文件時(shí),發(fā)現(xiàn)漏掉幾個(gè)文件,或者注釋寫錯(cuò)了,可以撤銷上一次提交:git commit --amend;
列出現(xiàn)在所有的標(biāo)簽:git tag;
使用特定的搜索模式列出符合條件的標(biāo)簽,例如只對(duì)1.4.2系列的版本感興趣:git tag -l "v1.4.2.*";
創(chuàng)建一個(gè)含附注類型的標(biāo)簽,需要加-a參數(shù),如git tag -a v1.4 -m "my version 1.4";
使用git show命令查看相應(yīng)標(biāo)簽的版本信息,并連同顯示打標(biāo)簽時(shí)的提交對(duì)象:git show v1.4;
如果有自己的私鑰,可以使用GPG來(lái)簽署標(biāo)簽,只需要在命令中使用-s參數(shù):git tag -s v1.5 -m "my signed 1.5 tag";
驗(yàn)證已簽署的標(biāo)簽:git tag -v,如git tag -v v1.5;
創(chuàng)建一個(gè)輕量級(jí)標(biāo)簽的話,就直接使用git tag命令即可,連-a,-s以及-m選項(xiàng)都不需要,直接給出標(biāo)簽名字即可,如git tag v1.5;
將標(biāo)簽推送到遠(yuǎn)程倉(cāng)庫(kù)中:git push origin?,如git push origin v1.5;
將本地所有的標(biāo)簽全部推送到遠(yuǎn)程倉(cāng)庫(kù)中:git push origin --tags;
創(chuàng)建本地分支?git branch 分支名
查看本地分支git branch
查看遠(yuǎn)程分支?git branch -a
切換分支?git checkout 分支名?(一般修改未提交則無(wú)法切換,大小寫問(wèn)題經(jīng)常會(huì)有,可強(qiáng)制切換?git checkout 分支名 -f?非必須慎用)
將本地分支推送到遠(yuǎn)程分支?git push <遠(yuǎn)程倉(cāng)庫(kù)> <本地分支>:<遠(yuǎn)程分支>
從遠(yuǎn)程倉(cāng)庫(kù)中抓取本地倉(cāng)庫(kù)中沒(méi)有更新git fetch
拉取遠(yuǎn)程分支倉(cāng)庫(kù)git pull
推送本地分支到遠(yuǎn)程分支git push
拉取遠(yuǎn)程新分支?git checkout -b serverfix origin/serverfix
合并本地分支?git merge hotfix:(將 hotfix 分支合并到當(dāng)前分支)
合并遠(yuǎn)程分支?git merge origin/serverfix
刪除本地分支?git branch -d hotfix:(刪除本地 hotfix 分支)
刪除遠(yuǎn)程分支?git push origin --delete serverfix
移除遠(yuǎn)程倉(cāng)庫(kù) git remote rm [remote-name]`
上傳新命名的本地分支:git push origin newName;
創(chuàng)建新分支:git branch branchName:(創(chuàng)建名為 branchName 的本地分支)
切換到新分支:git checkout branchName:(切換到 branchName 分支)
創(chuàng)建并切換分支:git checkout -b branchName:(相當(dāng)于以上兩條命令的合并)
查看本地分支:git branch
查看遠(yuǎn)程倉(cāng)庫(kù)所有分支:git branch -a
本地分支重命名:?git branch -m oldName newName
重命名遠(yuǎn)程分支對(duì)應(yīng)的本地分支:git branch -m oldName newName
把修改后的本地分支與遠(yuǎn)程分支關(guān)聯(lián):git branch --set-upstream-to origin/newName
修改遠(yuǎn)程倉(cāng)庫(kù)在本地的簡(jiǎn)稱:git remote rename [old-name] [new-name]
查看遠(yuǎn)程倉(cāng)庫(kù)信息:git remote show origin
列出當(dāng)前配置:git config --list
列出repository配置:git config --local --list
列出全局配置:git config --global --list
列出系統(tǒng)配置:git config --system --list
配置用戶名:git config --global user.name "your name";
配置用戶郵箱:git config --global user.email "youremail@github.com";
配置git命令輸出為彩色的:git config --global color.ui auto;
配置git使用的文本編輯器:git config --global core.editor vi;
$ cd ~/.ssh
$ ls
id_rsa id_rsa.pub known_hosts
復(fù)制代碼其中 id_rsa 是私鑰,id_rsa.pub 是公鑰。
2. 如果沒(méi)有那就開(kāi)始生成,設(shè)置全局的user.name與user.email
git config --list // 查看是否設(shè)置了user.name與user.email,沒(méi)有的話,去設(shè)置
// 設(shè)置全局的user.name與user.email
git config --global user.name “XX”
git config --global user.email “XX”
3. 輸入?ssh-keygen?即可(或ssh-keygen -t rsa -C "email")
$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/schacon/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /Users/schacon/.ssh/id_rsa.
Your public key has been saved in /Users/schacon/.ssh/id_rsa.pub.
The key fingerprint is:
4. 生成之后獲取公鑰內(nèi)容,輸入?cat ~/.ssh/id_rsa.pub?即可, 復(fù)制ssh-rsa一直到 .local這一整段內(nèi)容
$ cat ~/.ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAklOUpkDHrfHY17SbrmTIpNLTGK9Tjom/BWDSU
GPl+nafzlHDTYW7hdI4yZ5ew18JH4JW9jbhUFrviQzM7xlELEVf4h9lFX5QVkbPppSwg0cda3
Pbv7kOdJ/MTyBlWXFCR+HAo3FXRitBqxiX1nKhXpHAZsMciLq8V6RjsNAQwdsdMFvSlVK/7XA
t3FaoJoAsncM1Q9x5+3V0Ww68/eIFmb1zuUFljQJKprrX88XypNDvjYNby6vw/Pb0rwert/En
mZ+AW4OZPnTPI89ZPmVMLuayrD2cE86Z/il8b+gw3r3+1nKatmIkjn2so1d01QraTlMqVSsbx
NrRFi9wrf+M7Q== schacon@agadorlaptop.local
5. 打開(kāi) GitLab 或者 GitHub,點(diǎn)擊頭像,找到設(shè)置頁(yè)左側(cè)找到 SSH keys 按鈕并點(diǎn)擊,輸入剛剛復(fù)制的公鑰即可
參考