mkdir 創建空目錄
pwd 顯示當前目錄
cat <file> 查看文件的內容
git init 初始化一個Git倉庫:把目錄變成Git可以管理的倉庫,
目錄下會多一個.git目錄,這是Git的版本庫
Is -ah顯示目錄下所有文件夾,包括默認隱藏的.git目錄。
git add 把文件添加到暫存區
git commit -m "說明" 把暫存區的所有內容提交到當前分支
git status 查看狀態
git diff <file> 查看修改的內容(工作區和暫存區的不同,
工作區和原來的不同)
git log 顯示從最近到最遠的提交日志(版本)
git log --pretty=oneline 簡化輸出信息
git relog 顯示命令歷史
用帶參數的git log可以看到分支的合并情況:
git log --graph --pretty=oneline --abbrev-commit
git reset --hard HEAD^ 回退到上一個版本
注意:hard前有--
git reset --hard commit_id 回退到指定版本,commit id
版本號寫前幾位就可以。
git diff HEAD -- <file> 查看工作區和版本庫里面最新版本的區別
git checkout -- <file> 把文件在工作區的修改撤銷,回到最近一次git commit或git add時的狀態。
可用于修改后還沒add到暫存區的撤銷
git reset HEAD <file> 把暫存區的修改撤銷掉(unstage),
重新放回工作區
git reset命令既可以回退版本,也可以把暫存區的修改回退到工作區,當用HEAD時,表示最新的版本。
撤銷未add到暫存區(即撤銷工作區)的修改:git checkout -- <file>
撤消已add,未commit到分支(即撤銷暫存區)的修改:第一步,git reset HEAD <file>;第二步,git checkout -- <file>
撤銷本次已commit到分支(提交到版本庫)的修改:git reset --hard HEAD^
rm <file> 刪除文件。工作區和版本庫就不一致了
git checkout -- <file>用版本庫里的版本替換工作區的版本,
無論工作區是修改還是刪除。
//IDEA的revert相當于git checkout -- <file>
git rm <file> --> git commit
從版本庫中刪除該文件,要git commit
分支
創建與合并分支
HEAD是指向master,master指向提交的。所以,HEAD指向的就是當前分支。
master分支是一條線,master是一個指針。
當創建新的分支,例如dev時,Git新建了一個指針叫dev,指向master相同的提交,再把HEAD指向dev,就表示當前分支在dev上:
git checkout -b dev 創建dev分支,然后切換到dev分支
//相當于 git branch dev創建 + git checkout dev 切換分支
git branch 列出所有分支,當前分支前標一個*號
git merge 合并指定分支到當前分支
如:git merge dev 把dev分支的工作成果合并到master分支上。
(Fast-forward,快進模式:直接把master指向dev的當前提交)
git branch -d dev 刪除dev分支
git log --graph --pretty=oneline --abbrev-commit 可以看到分支的合并情況(graph圖表)
合并沖突
當Git無法自動合并分支時,就必須首先解決沖突,解決沖突后,再提交,合并完成。
創建+切換分支feature1,對內容a修改成AND --> add,commit
然后切換分支master,對內容a修改成& --> add,commit
這種情況下,Git無法執行“快速合并”。
若是git merge feature1, 文件中Git用<<<<<<< , ======= , >>>>>>>
標記出不同分支的內容。
此時若是git checkout feature1,會切換失敗,error: you need to resolve your current index first
readme.txt: needs merge
修改成and后保存,再add,commit。合并完成。(master會向前一個提交,feature1不動)
若再切換到feature1分支,其內容依然為AND。
最后刪除feature1分支 git branch -d feature1
合并模式:
- Fast forward,快進模式。
git merge dev 直接把master指向dev的當前提交。
這種模式下合并,看不出來曾經做過合并。刪除分支后,會丟掉分支信息。
- --no-ff方式的git merge,普通模式合并。
git merge --no-ff -m "merge with no-ff" dev
這種模式合并,要創建一個新的commit,
所以加上-m參數,把commit描述寫進去。
合并后的歷史有分支,能看出曾經做過合并。
這相當于有合并沖突,修改沖突后再提交。
Bug分支
從哪個分支修改bug就從哪個分支創建臨時分支。如,在master分支上修復
git stash 把未提交的工作現場“儲藏起來”,
等以后恢復現場后繼續工作
切換到master分支 -->
創建并切換到臨時分支 -->
修復bug,修改內容 -->
提交add,commit -->
切換到master分支,完成合并 -->
刪除臨時分支
git stash list 查看所有的“儲藏”
恢復工作現場:
方法1:git stash apply恢復+git stash drop刪除stash內容
方法2:git stash pop 恢復+刪除stash內容
可以多次stash,恢復的時候,先用git stash list 查看,然后恢復指定的stash,用命令:
git stash apply stash@{0}
git branch -D <name> 強行刪除沒有被合并過的分支
遠程倉庫
先有本地庫,后有遠程庫。添加+關聯
Create a new repo按鈕,輸入name,點擊create repository新建倉庫。
git remote add origin git@github.com:amyyanjie/test.git在本地關聯遠程庫
git push -u origin master把本地庫當前分支master推送到遠程
第一次推送master分支時,加-u參數。
Git不但推送,還會把本地和遠程的master分支關聯起來
git push origin master 把本地master分支的最新修改推送到GitHub
從遠程庫克隆
git clone git@github.com:amyyanjie/learngit.git
當從遠程倉庫克隆時,Git自動把本地的master分支和遠程的master分支對應起來了。遠程倉庫的默認名稱是origin。
git remote -v查看遠程庫信息
git remote rm origin 刪除已有的GitHub遠程庫
多人協作
git remote 查看遠程庫的信息
git remote -v 顯示更詳細
git push origin <branchName> 把該分支推送到遠程庫對應的遠程分支上
git clone git@github.com:amyyanjie/learngit.git
//當從遠程倉庫clone時,默認情況下,只能看到本地的master分支。
這時,要在dev分支上開發,就必須創建遠程origin的dev分支到本地
git checkout -b dev origin/dev 然后就可以在dev分支上修改,
并時不時 git push origin dev
git checkout -b <branchName> origin/<branchName> 在本地創建和遠程分支對應的分支
git pull 拉取所有分支到本地
git pull = git fetch + git merge
一般用git pull origin <branchName>
多人協作的工作模式
1、首先,試圖用git push origin <branchName> 推送修改;
-
2、如果推送失敗,則因為遠程分支比本地更新,需要先用git pull試圖拉取合并。
若git pull提示"no tracking information",說明沒有指定本地分支與遠程分支的鏈接:
git branch --set-upstream <branchName> origin/<branchName> 或git branch --set-upstream-to=origin/<branchName> <branchName>
再git pull就能成功
3、若git pull成功,但顯示合并有沖突,需要手動解決,并在本地提交
- 4、沒有沖突或解決掉沖突后,再用git push origin <branchName>推送就能成功
標簽
git tag <name> 打標簽。如git tag v1.0
先要切換到需要打標簽的分支上。
默認標簽是打在最新提交的commit上的。
也可指定一個commit id創建標簽:
git tag <name> <commitId>
git tag -a <tagName> -m "說明" <commitId> 創建帶有說明的標簽
用-a指定標簽名,-m指定說明文字
git tag -s <tagName> -m "說明" <commitId> 通過-s用私鑰簽名一個標簽。
簽名采用PGP簽名,必須首先安裝gpg(GnuPG)
git tag查看所有標簽
git show <tagName> 查看標簽信息
git push origin <tagNamae> 推送某個標簽到遠程
git push origin --tags 推送全部尚未推送到遠程的本地標簽
git tag -d <tagName> 從本地刪除標簽
git push origin :refs/tags/<tagName> 刪除遠程標簽
git config --global alias.st status 配置別名
配置GIt的時候,如果不加--global,只針對當前倉庫起作用。
每個倉庫的Git配置文件都放在.git/config文件中。而當前用戶的Git配置文件放在用戶主目錄下的一個隱藏文件.gitconfig中。