技能篇:git的簡易教程
阿新 • • 發佈:2021-08-03
https://www.cnblogs.com/cscw/p/15092727.html
在學校,或許憑藉一個人的力量就能負責整個專案的開發到上線。但是在公司,因為專案的複雜性和緊急性,一個專案的往往是由多個人實現,此時就有一個問題,程式碼提交和程式碼合併。git和svn,這篇文章來講講git的原理和使用
- version版本控制
- git的賬號配置
- 建立git倉庫
- git的原理
- 檔案操作命令
- 分支操作命令
關注公眾號,一起交流,微信搜一搜: 潛行前行
version版本控制
- 版本控制(Revision control)是一種在開發的過程中用於對檔案、目錄或工程等內容的修改歷史,方便檢視更改歷史記錄,備份及以便恢復以前版本的技術
- 沒有進行版本控制或者版本控制本身缺乏正確的管理,在軟體開發過程中將會引入很多問題,如軟體程式碼的一致性、軟體內容的冗餘、軟體開發過程中的併發性、軟體原始碼的安全性,以及軟體的整合等問題
git的賬號配置
- 配置名字和郵件地址
建立git倉庫
// 在當前目錄新建一個Git程式碼庫git的原理
- 專案檔案(Directory):使用Git管理的一個目錄,也就是一個倉庫,包含我們的工作區(WorkSpace)和 Git的管理空間(.git)
- 工作區(Workspace):就是平時存放專案程式碼的地方,一個資料夾而已
- git管理空間(.git):存放Git管理資訊的目錄,初始化倉庫的時候自動建立。裡面又包含暫存區(Index/Stage)和 本地倉庫(Repository)
- 暫存區(Index/Stage):用於存放你的臨時改動資訊,儲存即將提交到檔案列表資訊。可用於儲存/恢復 WorkSpace 中的臨時狀態
- 本地倉庫(Repository):這裡面存放你提交到所有版本的資料。其中HEAD指向最新放入倉庫的版本
- 遠端倉庫(Remote):託管程式碼的伺服器,和本地倉庫作用類似,不過它是公共的
狀態轉移流程
- 未跟蹤(Untracked): 此檔案僅僅在 workspace 中,但並沒有加入到 git 倉庫,不參與版本控制。通過 git add 狀態變為 Staged
- 檔案已經入庫(Unmodify): 未修改,即版本倉庫中的檔案快照內容與 workspace 中完全一致。這種型別的檔案有兩種變化,如果它被修改,而變為 Modified。如果使用 git rm 移出版本庫,則成為 Untracked 檔案
- 檔案已修改(Modified): 僅僅是修改, 並沒有進行其他的操作。通過 git add 可進入暫存 Staged 狀態,使用 git checkout 則丟棄修改過,返回到 unmodify 狀態,這個 git checkout 即從庫中取出檔案,覆蓋當前修改
- 暫存狀態(Staged): 執行 git commit 則將修改同步到倉庫中,這時庫中的檔案和 workspace 檔案又變為一致,檔案為 Unmodify 狀態。執行
git reset branchName fileName
取消暫存。檔案狀態恢復為 Modified
檔案操作命令
檢視檔案狀態
// 檢視所有檔案狀態新增檔案與目錄
// 新增指定檔案到暫存區移除檔案與目錄
// 將檔案從暫存區和工作區中刪除檔案提交 git commit
// 將暫存區檔案提交到本地倉庫區,message為說明資訊檢視檔案狀態及歷史 git log
git diff 比較差異
// 顯示暫存區和工作區的全部差異git reset 程式碼回退
- 有時提交了一些錯誤程式碼,我們想回滾怎麼辦,可以使用 git reset 重設定程式碼版本號。git reset 有三種模式 。soft、mixed、hard
-
--hard 模式
重置 HEAD 在當前分支到某次 commit 時,工作目錄裡的新改動和已經 add 到 stage 暫存區的新改動會全都消失。工作目錄(workspace)、暫存區(index/stage)及本地倉庫(repository)重置成目標 commit 的內容,所以效果看起來等同於清空暫存區和工作區 -
--soft 模式
--soft 模式在重置 HEAD 時,會保留工作目錄和暫存區中的內容,並把重置 HEAD 所帶來的新的差異放進暫存區,保留工作目錄(workspace)和暫存區(index/stage)的內容,只讓 repository 中的內容和 reset 節點保持一致,原節點和 reset 節點之間的差異變動會放入暫存區中(index/stage) -
--mixed 模式
git reset 如果不加引數,那麼預設使用--mixed引數。mixed 模式會保留 工作目錄(workspace)的內容,但會將暫存區(index/stage) 和 Repository 中的內容重置成 reset 節點一致,因此原節點和 reset 節點之間的差異變動會放入工作目錄(workspace)
git revert
- 如果我們想撤銷之前的某一版本,但是又想保留 commitId 提交之後的版本
分支操作命令
新建分支
// 基於當前分支新建一個分支,並且切換到新的分支 lwlgit push
~~ 將本地分支的更新全部推送到遠端倉庫 master 分支刪除分支
分支合併
- git-merge 命令是用於從指定的commit(s)合併到當前分支的操作
- 當產生合併衝突時,該部分會以
<<<<<<<
,=======
和>>>>>>>
表示。在=======
之前的部分是當前分支這邊的情況,在=======
之後的部分是對方分支的情況 - 解決完衝突的地方後使用
git add
加入到index中,然後使用git commit
產生合併節點
git pull/git fetch
- git fetch 可以拉取遠端倉庫的程式碼
- git pull。它不僅會拉取遠端分支,還會合並遠端和原生代碼,即:git pull = git fetch + git merge
git rebase 合併
- git rebase master 命令會把當前分支 curBranch 裡的每個提交(commit)取消掉,並且把它們臨時儲存為補丁(patch)(這些補丁放到".git/rebase"目錄中),然後把 curBranch 分支更新為 master 分支最新提交,最後把儲存的這些補丁應用到 curBranch 分支上
- 在 rebase 的過程中,也許會出現衝突(conflict)。 在這種情況,Git會停止rebase並會讓你去解決 衝突;在解決完衝突後,用 git add 命令去更新這些內容的索引(index), 然後,你無需執行 git-commit,只要執行
git rebase--continue
- 如果 git rebase master 之後。需要將當前分支 curBranch的程式碼移到 master。可以再次使用 git merge。此時合併後 master 的提交是一條線性 commit
git tag
- tag 對應某次 commit, 是一個點,是不可移動的。branch 對應一系列commit,是很多點連成的一根線,有一個HEAD 指標,是可以依靠 HEAD 指標移動的。所以,兩者的區別決定了使用方式,改動程式碼用 branch,不改動只檢視用 tag
- 建立 tag 是基於本地分支的 commit,而且與分支的推送是兩回事,就是說分支已經推送到遠端了,但是 tag 並沒有,如果要把 tag 推送到遠端分支上,需要另外執行 tag 的推送命令