git reset --hanrd撤回_一篇文章,全面掌握Git
版本控制
版本控制就是記錄項(xiàng)目文件的歷史變化。它為我們查閱日志,回退,協(xié)作等方面提供了有力的幫助。
版本控制一般分為集中化版本控制和分布式版本控制。
集中化主要的版本數(shù)據(jù)都保存服務(wù)端。
分布式版本數(shù)據(jù)分散在多端。
Git
Git屬于分布式版本控制,也是現(xiàn)在比較流行的一種版本管理工具。
Git項(xiàng)目有三個(gè)區(qū)塊:工作區(qū) / 暫存區(qū) / 版本庫
- 工作區(qū)存放從版本庫提取出來的文件,供我們編輯修改;
- 暫存區(qū)保存了下一次要提交的目錄信息;
- 版本庫保存項(xiàng)目版本元數(shù)據(jù)和Objects數(shù)據(jù),后文會(huì)詳解。
Git工作流程
# 下載 <<==== clone # 上傳 ====>> add ====>> commit ====>> push # 更新 <<==== merge|rebase <<===== fetch區(qū)分 Pull vs Fetch
我們將一個(gè)更新操作拆分為數(shù)據(jù)更新+合并處理兩部分,這樣來看 fetch 只是進(jìn)行數(shù)據(jù)更新。而pull 其實(shí)是 ( fetch + (merge|rebase) )組合操作,它執(zhí)行數(shù)據(jù)更新同時(shí)執(zhí)行合并處理。pull 默認(rèn)是fetch+merge 組合 ,也可以通過參數(shù) --rebase 指定為 fetch + rebase。
區(qū)分Merge vs Rebase
合并處理是Git很重要的一塊知識(shí)。兩個(gè)命令在工作中也經(jīng)常使用,區(qū)分它們對(duì)我們很有用。
場(chǎng)景如下
項(xiàng)目有一個(gè)mywork分支。C2時(shí)間點(diǎn)我和小明各自下載項(xiàng)目進(jìn)行功能開發(fā),小明效率比較高,先推送了C3 C4 到遠(yuǎn)程倉庫。我本地倉庫現(xiàn)在有C5 C6兩個(gè)提交,要推送到遠(yuǎn)程倉庫,需先同步遠(yuǎn)程倉庫版本。
如果通過 fetch + merge 方式,Git會(huì)將遠(yuǎn)程最新(C4)和本地最新(C6)進(jìn)行合并并產(chǎn)生一個(gè)新的(C7)。
沖突處理步驟
git merge # 發(fā)生沖突會(huì)出現(xiàn)沖突標(biāo)記 “<<<<<<< HEAD 40 ======= 41 >>>>>>> 41” # 手動(dòng)處理沖突 git add . git commit -m 'fix conflict' git push origin HEAD如果通過 fetch + rebase 方式,git會(huì)先將C5 C6存儲(chǔ)到.git/rebase零時(shí)目錄,合并成功后刪除。
沖突處理步驟
git rebase # 發(fā)生沖突會(huì)出現(xiàn)沖突標(biāo)記 “<<<<<<< HEAD 40 ======= 41 >>>>>>> 41” # 手動(dòng)處理沖突 git add . git rebase --continue git push origin HEAD小結(jié)
git merge 會(huì)產(chǎn)生大量Merge日志,可能會(huì)對(duì)查看帶來不便。不過大家還是根據(jù)實(shí)際情況進(jìn)行選取。
關(guān)于撤銷回退幾種場(chǎng)景
提交后發(fā)現(xiàn)有文件漏了,又不想提交兩次。此時(shí)通過 “git commit --amend” 可以合并為一個(gè)提交。
git commit -m 'initial commit' git add .gitignore git commit --amend如果文件想撤回且尚未提交,執(zhí)行下面命令撤出暫存空間(index)
git reset HEAD <file>...關(guān)于 reset 其它用法
# 重置到指定版本,之前提交內(nèi)容將丟失 git reset --hard HEAD # 重置到指定版本,保留更改的文件但未標(biāo)記為提交 git reset --mixed HEAD # 重置到指定版本,保留所有改動(dòng)文件 git reset –soft HEAD特別注意 當(dāng)你使用 “git reset --hard HEAD” 重置到某一版本,發(fā)現(xiàn)搞錯(cuò)了想回退。這時(shí)你可能會(huì)執(zhí)行“git log”,但是發(fā)現(xiàn)已經(jīng)沒有以前的版本記錄,怎么辦?送你一瓶后悔藥如下
# reflog 是Git操作的全日志記錄 git reflog6241462 (HEAD -> master) HEAD@{0}: reset: moving to 6241462 ea9b5ab HEAD@{1}: reset: moving to ea9b5ab 6241462 (HEAD -> master) HEAD@{2}: commit: Hello 34cd1e3 HEAD@{3}: commit: 3 ea9b5ab HEAD@{4}: commit: 2 729a8b1 (origin/master) HEAD@{5}: commit (initial): 1# 找到最左邊對(duì)應(yīng)hash值就可以回退到任意位置 git reset --hard {index}如果想撤回文件修改內(nèi)容且文件尚未提交,執(zhí)行下面命令
git checkout -- <file>如果創(chuàng)建的分支名稱需要更改
git branch -m old new# 如果分支已經(jīng)推送到遠(yuǎn)程,先刪除再推送新分支 git push origin --delete old git push origin new如果需要撤回的提交已經(jīng)推送到了遠(yuǎn)程倉庫,那么補(bǔ)救的方式只有創(chuàng)建新的提交。
可以利用revert快速撤回到需要回退的版本。
# 還原最近一個(gè)提交 git revert HEAD # 還原倒數(shù)第二個(gè) git revert HEAD^ # 還原倒數(shù)第第四個(gè) git revert HEAD~3版本庫 Objects
這一節(jié)介紹一下Git版本庫的存儲(chǔ)模型。
項(xiàng)目歷史變動(dòng)信息都記錄在object文件。文件名稱是通過哈希算法 ( 這里是SHA1(對(duì)象內(nèi)容) ) 產(chǎn)生的40位字符。
這種做法的一個(gè)優(yōu)點(diǎn)就是“在對(duì)比兩對(duì)象是否相同時(shí),只需要比較文件名稱就能迅速得出結(jié)果”
哈希算法:簡(jiǎn)單來說就是向函數(shù)輸入一些內(nèi)容,輸出長(zhǎng)度固定的字符串。這里SHA1函數(shù)固定輸出40長(zhǎng)度字符。object文件分 blob tree commit tag 四種類型
- blob 存儲(chǔ)文件數(shù)據(jù),一般是一個(gè)文件;
- tree 存儲(chǔ)目錄和樹的引用(子文件目錄);
- commit 存儲(chǔ)單一樹引用,時(shí)間點(diǎn),提交作者,上一次提交指針;
- tag 標(biāo)記特定的commit 比如說發(fā)版。
Blob
Blob 是二進(jìn)制數(shù)據(jù)塊,不會(huì)引用其它東西。如果目錄樹(或存儲(chǔ)庫中多個(gè)不同版本)中的兩個(gè)文件具有內(nèi)容相同,它們將共享相同的Blob對(duì)象。
Tree
Tree 存儲(chǔ)blob和tree的引用。
# 我查詢 add1a1306e20... git ls-tree add1a1306e20...100644 blob 4661b39c3460a5c1f9e9309e6341962e0499b037 README.md 040000 tree ad46b24a4b0648ede3ca090dde32c89b89f7f2c1 src ...Commit
Commit 包含下面幾個(gè)信息
Tag
git cat-file tag v_1.0object 24d16acd6aa08f74556c7ce551fa571b4bfe4079 type commit tag v_1.0 tagger lixingping <lixingping233@gmail.com> 1588591122 +0800例子
假設(shè)項(xiàng)目目錄結(jié)構(gòu)如下,我們進(jìn)行一個(gè)初始提交。幾種文件關(guān)系如下圖
|-- read.txt--| lib--| hello.java附上一些常用命令
生成SSH key
ssh-keygen -t rsa -b 4096 -C "email@example.com" # 指定生成的文件 ssh-keygen -t rsa -b 4096 -C "email@example.com" -f ~/.ssh/id_rsa_example # id_rsa_example.pub 粘貼遠(yuǎn)程倉庫# 配置多個(gè)遠(yuǎn)程倉庫 touch ~/.ssh/config#添加一下內(nèi)容 Host github.com HostName github.com User git IdentityFile ~/.ssh/id_rsa_githubHost example.com HostName example.com User git IdentityFile ~/.ssh/id_rsa_example配置
git config –global user.name “xxx” git config –global user.email “xxx@email.com“ git config --global core.autocrlf true # 建議配置 windows mac換行符不統(tǒng)一問題 git config --global core.editor vim # 配置默認(rèn)編輯器 git config --global core.excludesfile ~/.gitignore_global # 配置全局忽略文件 git config –list # 查看配置信息分支管理
git branch --list # 羅列本地所有分支 git branch --all # 羅列本地和遠(yuǎn)程所有分支 git branch -r # 羅列遠(yuǎn)程所有分支 git branch -v # 顯示各分支最后提交信息 git checkout <branch name> # 切換分支 git checkout -b <new branch name> # 創(chuàng)建新分支 git push origin <new branch name> # 推送新分支到遠(yuǎn)程 git checkout -m <old branch> <new branch> # 重命名分支名稱 git branch -d <[list]branch name> # 刪除本地分支 git push origin --delete <branch name> # 刪除遠(yuǎn)程分支標(biāo)簽管理
git tag -l # 羅列本地所有標(biāo)簽 git show <tag name> # 顯示指定標(biāo)簽 git tag -a v_1.0.0 -m "備注" # 創(chuàng)建標(biāo)簽 git push origin <tag name> # 推送標(biāo)簽到遠(yuǎn)程 git tag -d <tag name> # 刪除本地標(biāo)簽 git push --delete origin <tag name> # 刪除遠(yuǎn)程標(biāo)簽總結(jié)
工作多年以來一直在使用Git,但是對(duì)Git沒有一個(gè)系統(tǒng)了解,所以寫這篇文章歸整一下。
歡迎大家留言交流,一起學(xué)習(xí)分享!!!
總結(jié)
以上是生活随笔為你收集整理的git reset --hanrd撤回_一篇文章,全面掌握Git的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql 隔离级别 快照_「数据库架构
- 下一篇: 星星符号怎么打出来(手机半颗星符号怎么打