git简易指南
目錄
- 工作流
- 初始化倉庫
- 添加和提交
- 推送改動
- 分支
- 更新與合并
- 替換本地改動
- 回滾
- 遠程倉庫
- 有用的貼士
- GIT vs SVN
工作流
你的本地倉庫由 git 維護的三棵“樹”組成。第一個是你的 工作目錄,它持有實際文件;第二個是 緩存區(Index),它像個緩存區域,臨時保存你的改動;最后是 HEAD,指向你最近一次提交后的結果。
初始化倉庫
$ git init Initialized empty Git repository in /Users/michael/learngit/.git/ #初始化了空的git倉庫,生成的.git目錄用來跟蹤管理版本庫git init 把當前目錄變成Git可以管理的倉庫。
添加和提交
你可以計劃改動(把它們添加到緩存區),使用如下命令:
git add <filename> git add *這是 git 基本工作流程的第一步;使用如下命令以實際提交改動:
git commit -m "代碼提交信息"
現在,你的改動已經提交到了 HEAD,但是還沒到你的遠端倉庫。
推送改動
你的改動現在已經在本地倉庫的 HEAD 中了。執行如下命令以將這些改動提交到遠端倉庫:
git push origin master
可以把 master 換成你想要推送的任何分支。
如果你還沒有克隆現有倉庫,并欲將你的倉庫連接到某個遠程服務器,你可以使用如下命令添加:
git remote add origin
如此你就能夠將你的改動推送到所添加的服務器上去了。
分支
分支是用來將特性開發絕緣開來的。在你創建倉庫的時候,master 是“默認的”。在其他分支上進行開發,完成后再將它們合并到主分支上。
創建一個叫做“feature_x”的分支,并切換過去:
git checkout -b feature_x
切換回主分支:
git checkout master
再把新建的分支刪掉:
git branch -d feature_x
除非你將分支推送到遠端倉庫,不然該分支就是 不為他人所見的:
git push origin
更新與合并
要更新你的本地倉庫至最新改動,執行:
git pull
以在你的工作目錄中 獲取(fetch) 并 合并(merge) 遠端的改動。
要合并其他分支到你的當前分支(例如 master),執行:
git merge
兩種情況下,git 都會嘗試去自動合并改動。不幸的是,自動合并并非次次都能成功,并可能導致 沖突(conflicts)。 這時候就需要你修改這些文件來人肉合并這些 沖突(conflicts) 了。改完之后,你需要執行如下命令以將它們標記為合并成功:
git add
在合并改動之前,也可以使用如下命令查看修改的內容:
git diff
替換本地改動
假如你做錯事(自然,這是不可能的),你可以使用如下命令替換掉本地改動:
git checkout --
此命令會使用 HEAD 中的最新內容替換掉你的工作目錄中的文件。已添加到緩存區的改動,以及新文件,都不受影響。
假如你想要丟棄你所有的本地改動與提交,可以到服務器上獲取最新的版本并將你本地主分支指向到它:
git fetch origin
git reset --hard origin/master
因為暫存區的存在,撤銷修改分為幾種情況(通過 git status 查看倉庫狀態時會提示相關撤銷修改的命令):
修改后,文件沒有放入暫存區(即文件一直在工作區):用 git checkout -- 文件名 撤銷工作區的改動(回到跟版本庫一樣的狀態,即回到最近一次 git commit時的狀態,所有改動全部清除)
修改后,文件放入暫存區,且文件沒有再次修改(即文件已經進入暫存區):分兩步:先用 git reset 撤銷 git add 操作(此時更改仍留在工作區),再執行 git checkout -- 文件名 清除工作區的改動
修改后,文件放入暫存區,且文件再次修改:分三步:先用 git checkout -- 文件名 撤銷工作區的改動,再用 git reset 撤銷 git add 操作(此時更改仍留在工作區),最后執行 git checkout -- 文件名 清除工作區的改動
git checkout -- 文件名 命令可以撤銷文件在工作區的修改。
git reset 文件名 命令可以撤銷指定文件的 git add 操作,即這個文件在暫存區的修改。
git reset 命令可以撤銷之前的所有 git add 操作,即在暫存區的修改
回滾
git status命令可以讓我們時刻掌握倉庫當前的狀態
git diff 查看最近的修改
git diff HEAD -- readme.txt 查看工作區和版本庫里面最新版本的區別
git log 顯示從最近到最遠的提交日志
$ git log commit 5e75f785d57170a2685b8a8cc405cb11a9561bf4 #5e75f... commit id(版本號) Author: sunchenwei <sun.chenwei@puscene.com> Date: Fri Jun 7 19:11:23 2019 +0800gitcommit 9aa60b6f4db0bceda4849adc1331a4f4054923b5 Merge: 88008b4 2c79a39 Author: sunchenwei <sun.chenwei@puscene.com> Date: Sun Jun 2 23:14:04 2019 +0800Merge remote-tracking branch 'origin/gh-pages' into gh-pagescommit 88008b4cfd8c7c0751763b9be5d6694a7bda67a5 Author: sunchenwei <sun.chenwei@puscene.com> Date: Sun Jun 2 23:13:43 2019 +0800數據結構git log --pretty=oneline 查看簡化歷史日志
$ git log --pretty=oneline 42c27bcd3e39c258d829102a23e935d7903d7767 git d3d480c09532f75da2d68561e187b8703280b8b2 git 5e75f785d57170a2685b8a8cc405cb11a9561bf4 git 9aa60b6f4db0bceda4849adc1331a4f4054923b5 Merge remote-tracking branch 'origin/gh-pages' into gh-pages 88008b4cfd8c7c0751763b9be5d6694a7bda67a5 數據結構 2c79a392720ddaaa1fef4baeb1fa391a3dd87180 Delete php.xml f2bd1c4fcd358dca858ab35702e9dc37cb7b7360 Delete deployment.xml 873817ccd4228cb3691a543ca95e420da350c5be Delete webServers.xml 4dc69c611a1656ccd9125af4c53aab0872275cf0 mysql f2e9626ba2c85434c422a2979c3c318a4ad207aa mysql ed1c403d34fb3f029c5870df2e73635823e2eb6c mysql 2d3d814faf09f0778a0b3175ce41373712b7d0bc mysql每提交一個新版本,實際上Git就會把它們自動串成一條時間線。
回退版本
#HEAD表示當前版本 #上上一個版本就是HEAD^^git reset --hard HEAD^git reset --hard 【版本號】 # 回滾到指定版本回退成功后,git log 查看日志會發現當前版本往前推的版本找不到日志了,但是只要提供未來版本的id就可以回到未來。
git reset --hard 42c27bc #42c27bc只需提供前幾個字符就可以找到了版本了即使找不到id,也可以查看操作日志:
git reflog cindy:WindBlog zhaoyu$ git reflog 42c27bc HEAD@{0}: reset: moving to 42c27bcd3e39c258d829102a23e935d7903d7767 d3d480c HEAD@{1}: reset: moving to HEAD^ 42c27bc HEAD@{2}: reset: moving to 42c27bcd3e39c258d829102a23e935d7903d7767 d3d480c HEAD@{3}: reset: moving to HEAD^ 42c27bc HEAD@{4}: commit: git d3d480c HEAD@{5}: commit: git 5e75f78 HEAD@{6}: commit: git圖示流程
┌────┐ │HEAD│ └────┘│└──> ○ 42c27bcd3e39c258d829102a23e935d7903d7767│○ d3d480c09532f75da2d68561e187b8703280b8b2│○ 5e75f785d57170a2685b8a8cc405cb11a9561bf4改為指向 d3d480c:┌────┐ │HEAD│ └────┘││ ○ 42c27bcd3e39c258d829102a23e935d7903d7767│ │└──> ○ d3d480c09532f75da2d68561e187b8703280b8b2│○ 5e75f785d57170a2685b8a8cc405cb11a9561bf4遠程倉庫
git push origin master
有用的貼士
內建的圖形化 git:
gitk
彩色的 git 輸出:
git config color.ui true
顯示歷史記錄時,只顯示一行注釋信息:
git config format.pretty oneline
交互地添加文件至緩存區:
git add -i
GIT vs SVN
- git 是分布式,svn 是集中式;
Git跟Svn一樣有自己的集中式版本庫和Server端,但Git更傾向于分布式開發,因為每一個開發人員的電腦上都有一個Local Repository,所以即使沒有網絡也一樣可以Commit,
查看歷史版本記錄,創建項 目分支等操作,等網絡再次連接上Push到Server端。svn沒有網絡無法操作,每個人的版本都是提交到服務器,服務器壞了就雪崩。 - Git把內容按元數據方式存儲,而SVN是按文件:因為,.git目錄是處于你的機器上的一個克隆版的版本庫,它擁有中心版本庫上所有的東西,例如標簽,分支,版本記錄等。.git目錄的體積大小跟.svn比較,你會發現它們差距很大。
- Git的內容的完整性要優于SVN: GIT的內容存儲使用的是SHA-1哈希算法。這能確保代碼內容的完整性,確保在遇到磁盤故障和網絡問題時降低對版本庫的破壞。
- 提交代碼,查看日志,推送具有閃電般的速度
git提交是個本地操作,相對svn閃電一般。
本地包含了完整的日志,無需網絡
git向遠程服務器推送提交內容相比svn更快
合并對提交過程的保留
git:合并操作保留原有的提交過程(即保留了合并來源的作者、提交次數、分離提交的內容)。svn:合并操作把來源多個提交合并成了一個合并提交,即在提交歷史中Crash了自然的提交過程。
轉載于:https://www.cnblogs.com/followyou/p/11011361.html
總結
- 上一篇: 云计算开发教程:Python自动化运维开
- 下一篇: UVa1601