技能篇:git的簡易教程


在學校,或許憑借一個人的力量就能負責整個項目的開發到上線。但是在公司,因為項目的復雜性和緊急性,一個項目的往往是由多個人實現,此時就有一個問題,代碼提交和代碼合並。git和svn,這篇文章來講講git的原理和使用

  • version版本控制
  • git的賬號配置
  • 創建git倉庫
  • git的原理
  • 文件操作命令
  • 分支操作命令

關注公眾號,一起交流,微信搜一搜: 潛行前行

version版本控制

  • 版本控制(Revision control)是一種在開發的過程中用於對文件、目錄或工程等內容的修改歷史,方便查看更改歷史記錄,備份及以便恢復以前版本的技術
  • 沒有進行版本控制或者版本控制本身缺乏正確的管理,在軟件開發過程中將會引入很多問題,如軟件代碼的一致性、軟件內容的冗余、軟件開發過程中的並發性、軟件源代碼的安全性,以及軟件的整合等問題

git的賬號配置

  • 配置名字和郵件地址
# git config --global user.name "hello lwl"
# git config --global user.email lwl@csc.com
// 查看系統config
# git config --system --list
// 查看當前用戶(global)配置
# git config --global  --list
// 查看當前倉庫配置信息
# git config --local  --list

創建git倉庫

// 在當前目錄新建一個Git代碼庫
# git init
// 克隆一個項目和它的整個代碼歷史(版本信息)
# git clone [git@github.com:cscsss/learnHome.git]

git的原理

image.png

  • 項目文件(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
    63651-20170909091456335-1787774607.jpg

文件操作命令

查看文件狀態

// 查看所有文件狀態
# git status
// 查看指定文件狀態
# git status [fileName]

添加文件與目錄

// 添加指定文件到暫存區
# git add [file1] [file2] ...
// 添加指定目錄到暫存區,包括子目錄文件
# git add [dir]

移除文件與目錄

// 將文件從暫存區和工作區中刪除
# git rm <fileName>
// 將 fileName 從暫存區刪除文件,仍保留在當前工作目錄中
# git rm --cached <fileName>

文件提交 git commit

// 將暫存區文件提交到本地倉庫區,message為說明信息
# git commit -m [message] 
// 將暫存區的指定文件 fileName 提交到本地倉庫
# git commit [fileName] -m [message] 
// 追加漏提交的暫存區文件。等價 git add . +  git commit -m 'message'
# git commit --amend -m [message] 

查看文件狀態及歷史 git log

# git log  //查看提交歷史
# git log --oneline //以精簡模式顯示查看提交歷史
# git log -p <fileName> //查看指定文件的提交歷史
# git blame <fileName> //以列表方式查看指定文件的提交歷史

git diff 比較差異

// 顯示暫存區和工作區的全部差異
# git diff 
// 顯示 filepath 路徑文件中,工作區與暫存區的差異
# git diff filePath   
// 顯示在工作區 filePath 文件與 HEAD 分支的差異
# git diff HEAD filePath 
// 顯示在工作區的 filePath 文件與某次提交 commitId 的差異
# git diff commitId filePath 

git reset 代碼回退

  • 有時提交了一些錯誤代碼,我們想回滾怎么辦,可以使用 git reset 重設置代碼版本號。git reset 有三種模式 。soft、mixed、hard
// git reset [--soft | --mixed | --hard] [HEAD]
// git reset [--soft | --mixed | --hard] [commit]
# git reset –hard HEAD~3  //會將最新的3次提交全部重置,就像沒有提交過一樣
# git reset 003444c77bae2b0874be17b81a829cfb1237d9ce //重置到003444c7
  • --hard 模式
    image.png
    重置 HEAD 在當前分支到某次 commit 時,工作目錄里的新改動和已經 add 到 stage 暫存區的新改動會全都消失。工作目錄(workspace)、暫存區(index/stage)及本地倉庫(repository)重置成目標 commit 的內容,所以效果看起來等同於清空暫存區和工作區

  • --soft 模式
    image.png
    --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 提交之后的版本
# git revert -n commitId

分支操作命令

新建分支

// 基於當前分支新建一個分支,並且切換到新的分支 lwl
# git checkout -b lwl  
// 基於遠程分支 originBranch 並新件分支 csc
# git checkout -b csc originBranch
// 新建一個 csc 分支,但是仍停留在原來分支
# git branch csc 
// 切換到 csc 分支
# git checkout csc 

git push

~~ 將本地分支的更新全部推送到遠程倉庫 master 分支
# git push origin master 
~~ 刪除遠程 branchname 分支
# git push origin -d <branchName>   

刪除分支

# git branch -D <branchname>  
~~ 刪除本地 dev1 分支
# git branch -D dev1 

分支合並

image.png

  • git-merge 命令是用於從指定的commit(s)合並到當前分支的操作
# git merge branchName //當前分支和 branchName 合並
# git merge -m <msg> <commit> //當前分支和 branchName commit及之前的提交合並
# git merge --abort // 取消合並
  • 當產生合並沖突時,該部分會以<<<<<<<=======和 >>>>>>>表示。在=======之前的部分是當前分支這邊的情況,在=======之后的部分是對方分支的情況
  • 解決完沖突的地方后使用git add加入到index中,然后使用git commit產生合並節點

git pull/git fetch

  • git fetch 可以拉取遠程倉庫的代碼
~~ 拉取所有遠端的最新代碼
# git fetch --all  
~~ 拉取遠程最新 master 分支代碼(指定 master 分支)
# git fetch origin master 
  • git pull。它不僅會拉取遠程分支,還會合並遠端和本地代碼,即:git pull = git fetch + git merge
~~ 拉取遠程倉庫分支,更新並合並到本地分支
# git pull  
~~ 將遠程 master 分支合並到當前本地 master 分支
# git pull origin master 
~~ 將遠程 master 分支合並到當前本地 lwl 分支,冒號后面表示本地分支
# git pull origin master:lwl 

git rebase 合並

  • git rebase master 命令會把當前分支 curBranch 里的每個提交(commit)取消掉,並且把它們臨時保存為補丁(patch)(這些補丁放到".git/rebase"目錄中),然后把 curBranch 分支更新為 master 分支最新提交,最后把保存的這些補丁應用到 curBranch 分支上
    image.png
  • 在 rebase 的過程中,也許會出現沖突(conflict)。 在這種情況,Git會停止rebase並會讓你去解決 沖突;在解決完沖突后,用 git add 命令去更新這些內容的索引(index), 然后,你無需執行 git-commit,只要執行git rebase --continue
# git rebase branchName // branchName 合並到當前分支
# git rebase --continue // 解決沖突后繼續合並
# git rebase --abort //取消合並
# git rebase -i HEAD~2 //合並提交 --- 2表示合並2個。也可以是3...
  • 如果 git rebase master 之后。需要將當前分支 curBranch的代碼移到 master。可以再次使用 git merge。此時合並后 master 的提交是一條線性 commit

git tag

  • tag 對應某次 commit, 是一個點,是不可移動的。branch 對應一系列commit,是很多點連成的一根線,有一個HEAD 指針,是可以依靠 HEAD 指針移動的。所以,兩者的區別決定了使用方式,改動代碼用 branch,不改動只查看用 tag
  • 創建 tag 是基於本地分支的 commit,而且與分支的推送是兩回事,就是說分支已經推送到遠程了,但是 tag 並沒有,如果要把 tag 推送到遠程分支上,需要另外執行 tag 的推送命令
# git tag <tagName> //基於最新的 commitId 創建 tagName
# git tag -a <tagName> <commitId> // 基於某次 commitId 創建 tagName
# git push origin <tagName> //推送到遠程倉庫
# git push --tags //推送所有標簽

# git tag -d <tagName> // 刪除本地 tag 
# git push origin :refs/tags/<tagName> // 刪除遠程 tag 

歡迎指正文中錯誤

參考文章


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM