注:該筆記完全是個人在學習《廖雪峰的git教程》中自己總結的筆記,其中肯定會有不少錯誤,請讀者朋友們斧正,感謝!!
廖旭峰的官網:
https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000
Git版本控制:
本質:對倉庫中的文件階段性修改的記錄(即版本庫)
----------若在倉庫中創(chuàng)建一個空目錄時,git是不能察覺他的存在的
svn與git:
一般:
svn 集中式的版本控制系統(tǒng),有一個中央服務器,有網才能工作
git 分布式的版本控制系統(tǒng),任何一個節(jié)點都可以當作中央服務器,斷網也可以工作
反思:
開始以為svn真的只有在有網的情況下才能工作,但是很多人說斷網也可以工作,不能人云亦云,大量查看評論
總結:
所謂的svn只能在有網的情況下可以工作,不是說不能進行開發(fā),修改文件操作,而是指不能提交版本操作(即只有中央服務器維護一套版本庫),其他節(jié)點主機只能向中央服務器提出commit請求,由中央服務器來執(zhí)行。而git是每個節(jié)點主機都擁有一個完整的版本庫,可以在本地斷網的情況下隨意commit,所有的歷史版本都會記錄在本地,最后使用push向遠程服務器提交自己的文件及版本庫
svn與git的區(qū)別:
svn:必須有中央服務器 (記錄版本庫)
git:可以沒有中央服務器(本地維護版本庫,中央服務器只是用來方便交流)
所謂不能工作,特指版本提交:
=====================================================
GIt使用
注:該筆記不太適合完全的小白,是自己學習的一個記錄;若想從0開始建議移步《廖雪峰的git教程》
(所有操作均在linux下進行)
1.安裝git:
sudo apt-get install git (ubuntu)
yum install git (redhat/centos)
2.配置git:
git config --global user.name 'yourname'
git config --global user.email 'email@example.com'
--global 表示全局設置,這臺主機的所有git倉庫都使用該配置
3.git倉庫初嘗試:
mkdir learngit
cd learngit
git init
vi a.txt
git add a.txt
git commit -m 'add a new file a.txt'
創(chuàng)建了一個learngit目錄,將該目錄初始化為了git倉庫(repository),并添加了一個a.txt并提交到了版本庫中
圖解:
【版本一:】

【版本二:修正版】

git init (將learngit初始化為git倉庫)
git add a.txt (將工作區(qū)中的a.txt添加到暫存區(qū)中)
git commit -m 'add a.txt' (將暫存區(qū)中的a.txt提交到版本庫)
git reset HEAD a.txt (將暫存區(qū)中的a.txt清除)
git checkout -- a.txt (將工作區(qū)中的a.txt回退)
git diff a.txt (對比工作區(qū)與緩存區(qū)中的a.txt)
git diff --cached a.txt (對比暫存區(qū)與版本庫中的a.txt)
git diff HEAD -- a.txt (對比工作區(qū)與版本庫中的a.txt)
git status (查看整個倉庫的狀態(tài))
git log (查看版本的信息)
git log --pretty=oneline (單行顯示版本庫)
gti reset --hard <commitid>(切換到具體的提交commit)
git reflog (查看git命令記錄)
==============================================
要點:
1.在Git中,用HEAD表示當前版本,上一個版本就是HEAD^ ,上上一個版本就是HEAD^^ ,當然往上100個版本寫100個^比較容易數不過來,所以寫成HEAD~100
=============================================
FAQ:將廖大的官網中網友們的一些經典問題搜集:
Q1:本地版本回滾了,然后想讓遠端的版本也回滾。
遠程和本地的版本庫位:a->b->c
通過git reset --hard b.id 本地:a->b push到遠程 a->b
但是會出問題
A1:
假設一開始你的本地和遠程都是:
a -> b -> c
你想把HEAD回退到b,那么在本地就變成了:
a -> b
這個時候,如果沒有遠程庫,你就接著怎么操作都行,比如:
a -> b -> d
但是在有遠程庫的情況下,你push會失敗,因為遠程庫是 a->b->c,你的是 a->b->d
兩種方案:
1.push的時候用--force,強制把遠程庫變成a -> b -> d,大部分公司嚴禁這么干,會被別人揍一頓
做一個反向操作,把自己本地變成a -> b -> c -> d,
注意b和d文件快照內容一莫一樣,但是commit id肯定不同,
再push上去遠程也會變成 a -> b -> c -> d
簡單地說就是你無法容易地抹去遠程庫的提交信息,所以本地提交怎么都行,push前想好了
2.使用 git revert <commit_id>操作實現(xiàn)以退為進,
git revert 不同于 git reset 它不會擦除"回退"之后的 commit_id ,
而是正常的當做一次"commit",產生一次新的操作記錄,所以可以push,不會讓你再pull