1.暫存工作區內容
git stash 保留當前工作區狀態,只會儲藏已經在索引中的文件;指定 --include-untracked 或 -u 標記,會存儲未被索引的文件;--keep-index,不會儲藏已暫存的東西;
git stash list 查看保留的工作狀態
git stash pop 恢復工作區狀態
(git stash pop恢復工作區的同時會刪除stash中的內容;如果不想刪除內容,可以使用git stash apply恢復工作區,然後再使用git stash drop刪除stash中的內容,git stash apply 版本號 可以用來恢復指定版本的工作區內容)
2.rm誤刪除文件恢復
git reset HEAD file
git checkout -- file
3.版本切換
git reset --hard commit_id 撤銷修改,但是不會保留修改
git reset --soft commit_id 保留修改,將改動放至緩存區
git reset --mixed commit_id 保留修改,不將改動放至緩存區
4.修改commit提交信息
git commit --amend #修改最後一次提交的commit信息
5.變基
rebase 可以把本地未push的分叉提交歷史整理成直線,也可以與commit操作結合,更改commit信息
底層操作過程:先將HEAD指向目標分支和當前分支的共同祖先commit節點;對比當前分支指針與HEAD指針提取相應的修改並存爲臨時文件;將當前分支指針指向目標分支指針;將臨時文件依序apply完以後再將HEAD指向當前分支
git rebase -i HEAD~n
6.挑揀commit提交
cherry-pick 可以用於將在其他分支上的 commit 修改,移植到當前的分支。當執行完 cherry-pick 之後,將會自動生成一個新的 commit 進行提交,也就是會有一個新的 commit ID。增加 -x 參數,表示保留原提交的作者信息進行提交
*可以一次將一個連續的時間序列內的 commit ,設定一個開始和結束的 commit ,進行 cherry-pick 操作;
git cherry_pick <start-commit-id>…<end-commit-id> 左開右閉
git cherry_pick <start-commit-id>^…<end-commit-id> 左閉右閉
*注意:cherry pick的commit id一定要按照時間順序來,不然很容易出現問題
7.在不同分支挑揀文件
挑選某個分支上的某些文件至當前分支:git checkout <branch name> file1 file2 file3
eg:git checkout feature f.txt 將feature分支的f.txt複製到當前分支
將當前分支上的某個文件至某個分支:git checkout --patch <branch name> file1 file2
eg:git checkout --patch master f.txt 將當前分支上的f.txt粘貼至master分支
8.拉取遠程分支至本地分支
git checkout -b 本地分支名 遠程倉庫名/遠程分支名
9.合併分支
git merge dev 將dev分支合併至當前分支
底層過程:git會查找兩個分支末端所指的快照以及這兩個分支的祖先,做三方合併;當兩個要合併的快照其中一個爲祖先時,將默認爲fast-forward模式合併(簡單的將指針向前推進),該模式下刪除分支之後可能會丟失分支信息;爲了保留完整信息,可以禁用Fast-forward模式:git merge --no-ff -m “merge with no-ff” <branch mane> --no-ff 表示禁用Fast-forward,此時git會在merge時生成一個新的commit,因此需要使用-m 提交相關commit描述
10.拉取遠程分支更新至本地
git pull <遠程倉庫名> <遠程分支名>:<本地分支名>
git pull = git fetch + git merge(git pull 先從線上抓取東西下來fetch,然後更新進度合併merge)
git pull --rebase (先從線上抓取東西下來fetch,然後更新進度合併rebase)
*如果git pull提示no tracking information,則說明本地分支和遠程分支的鏈接關係沒有創建,用命令git branch --set-upstream-to <branch-name> origin/<branch-name>
11.提交代碼至遠程倉庫
git push <倉庫名> <分支名> 將本地倉庫所做更改提交至遠程倉庫某一分支
*首次push:git push -u origin master
12.比較兩個版本代碼之間的不同
git diff 比較算入暫存區修改的當前文件與工作區文件之間的區別
git diff HEAD 比較當前最新commit與工作區的區別
git diff commit_id 比較某個commit與工作區的區別
git diff --cached 比較最新提交與暫存區的區別
git diff --cached commit_id 比較某個commit與暫存區的區別
13.Fork和分支的區別
Fork:不是Git操作而是GitHub操作,將原項目進行拷貝,新建一個Repository,在該Repository所做操作,對原來的項目的Repository沒有任何影響。當想要向原項目合併時,需要提交merge Requests或pull Requests。
分支:Git操作,是一個項目倉庫中的代碼管理方式,一種方便多人協作的方式。在原項目的Resposity進行操作,操作歷史會被記錄。
14.添加自定義git命令
*修改global文件,需在.gitconf文件中添加自定義命令表示方式,等號右邊的操作等同於等號左邊的操作:
vim ~/.gitconf
eg:添加內容
[alias]
lg = log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit
mycommit = log --author=cym
保存修改文件之後,在命令行中使用命令git lg與在命令行中使用命令log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit效果是一樣的
*也可以修改某個項目的.gitconf文件,此時的自定義命令只對該項目起作用。項目的.gitconf文件在該項目主目錄下的.git文件下名爲config
eg:項目名爲test 該項目的conf文件路徑爲:test/.git/config
15.查看某次提交的具體修改內容
git show <commit id>