https://www.liaoxuefeng.com/wiki/896043488029600 廖雪峰的git教程
https://www.ruanyifeng.com/blog/2015/12/git-cheat-sheet.html 阮一峰的git命令清单
一、安装
git --version
:查看git版本git config --global XXXX
:全局配置
二、本地文件管理
- 三个区域:工作区 —> 暂存区(stage) —> 版本库
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ykP6HmV6-1665385735424)(https://www.liaoxuefeng.com/files/attachments/919020037470528/0)]
初始化一个本地仓库
mkdir XXX
:创建XXX文件夹git init
:将该文件夹初始化为git仓库Initialized empty Git repository in /Users/michael/learngit/.git/
添加
-
git add <file>
:工作区 添加指定文件到 暂存区git add .
:添加所有文件
-
git commit -m <message>
:暂存区 提交至 版本库
查看修改状态
git status
:查看当前项目修改状态
查看commit记录
git log
:查看commit记录git log -5 --pretty=oneline
:精简到一行,且仅查看最近5条
查看命令记录
git reflog
:查看每次的命令
(工作区)版本回退
-
git reset --hard <commitId>
:工作区 回退到 版本库 中某个版本(丢弃commit,丢弃工作区)- HEAD:当前版本的指针
git reset --hard HEAD^
:回退到上一个版本git reset --hard HEAD^^
:回退到上上个版本
-
git reset --soft <commitId>
:工作区 回退到 该次commit之前的样子(丢弃commit,不丢弃工作区)
丢弃暂存区/工作区的修改
-
git reset HEAD <fileName>
:将 暂存区 文件回退到 工作区 (unstage) -
git checkout -- file
:丢弃 工作区 的 “修改(改动/删除等操作)”- 回到最近一次
add
(在文件进入暂存区后修改)或commit
(在文件未进入暂存区前修改)的状态 - 丢弃当前工作区所有修改:
git checkout .
- 回到最近一次
删除文件
git rm <fileName>
:删除文件- 删除完后应重新
commit
- 删除完后应重新
暂存工作区
git stash (push -m "save message")
:暂存工作区内容(压栈)git stash list
:查看stash栈的记录git stash pop
:恢复暂存的内容到工作区,同时删除stash记录(弹栈),等价于- (1)
git stash apply
:恢复暂存的内容到工作区 - (2)
git stash drop
:删除stash记录 git stash pop stash@{X}
:取出并删除指定的stash
- (1)
合并某次commit到当前分支
git cherry-pick <commit>
:合并某次commit到当前分支
合并多次commit
- 情景:在push到远程仓库之前,同一个需求多次进行commit(从dev分支拉出bugfix分支进行开发)
-
(1)首先用
git log
查看commit记录commit XXX(id设为1004) //bugfix commit XXX(id设为1003) //bugfix commit XXX(id设为1002) //bugfix commit XXX(id设为1001) //dev commit XXX(id设为1000) //dev
-
(2)使用
git rebase -i 1001
指向最开始拉出bugfix分支的原分支dev的最后一次提交上(即1001,1002-1004为bugfix的commit),按下enter
进入vi的编辑模式- 按
i
进入insert
模式
// 修改前 pick 1002 pick 1003 pick 1004 # Rebase 1001..1004 onto 1001 # ... # .... //修改后 pick 1002 squash 1003 // pick 的意思是要会执行这个 commit squash 1004 // squash 的意思是这个 commit 会被合并到前一个commit # Rebase 1001..1004 onto 1001 # ... # ....
- 按
esc
退出insert
模式 - 输入
:wq
保存并退出,随后进入commit message的编辑界面
(删除这里原来所有信息,修改为合并后的新commit的commit message) # Please enter the commit message for your changes. ....
- 按
-
再次输入
git log
查看(合并后的commit会形成一个新的commit)commit XXX(id设为1005) //bugfix commit XXX(id设为1001) //dev commit XXX(id设为1000) //dev
-
tips:合并不相邻的commit:http://www.d2p.top/2019/12/23/git-rebase-i/
-
三、远程仓库
Tips:记得添加SSH key
-
git remote add origin XXXX
:将当前本地仓库关联远程仓库- XXX 为远程仓库地址
git remote -v
:查看远程库信息
-
git push origin branch-name
:将 本地版本库 推送到 远程库 的某分支上git push -u origin branch-name
:第一次推送时使用 “-u” 参数关联本地当前分支与远程某分支
-
git clone XXX
:克隆某个远程仓库到本地 -
git branch --set-upstream-to=origin/XXX YYY
:将本地分支YYY与远程分支XXX关联git remote -v
:查看所链接的远程仓库
-
git pull
:拉取远程仓库的最新commit(同时直接合并到工作区)git fetch
:拉取远程仓库的最新commit到自己的版本库
四、分支管理
- HEAD(当前版本)、master、dev均是指针
创建分支
-
git checkout -b <分支名>
:(从当前分支) 创建并切换到某分支,等价于- (1)
git branch <分支名>
:创建分支 - (2)
git checkout <分支名>
或git switch <分支名>
:切换分支
- (1)
-
git checkout -b 本地分支名x 远程仓库名/远程分支名x
:拉取远程分支并创建本地分支 -
git switch -c <分支名>
:(从当前分支) 创建并切换到某分支
查看分支
git branch
:查看当前所有分支- 当前分支前有
*
号
- 当前分支前有
合并分支
-
git merge <分支名>
:合并指定分支到当前分支 -
git merge --no-ff <分支名>
:合并指定分支到当前分支(禁用Fast Forword)- Fast Forword在没有冲突的情况下可能会直接移动指针,而不会在merge的时候生成一个commit记录,导致丢失分支信息
-
git rebase <分支名>
:变基,使commit记录成为一条直线,更加清晰
删除分支
git branch -d <分支名>
:删除某个分支-D
强制删除某个还没有被合并过的分支
合并分支冲突
-
情景:
git merge <分支名>
后出现冲突- 冲突文件会通过
<<<<<<<<
、======
、>>>>>>>
来标记不同版本
- 冲突文件会通过
-
处理:手动处理冲突后重新提交
- eg:
git commit -m "conflict fixed"
- eg:
-
检测是否有冲突:
git diff --check
关联远程分支
git branch --set-upstream-to=origin/[remote-branch] [branch]
:建立追踪关系,在现有分支与指定的远程分支之间git push origin [branch]:[remote-branch]
: 推送本地的feature-branch(冒号前面的)分支到远程origin的feature-branch(冒号后面的)分支(没有会自动创建)- 查询本地分支所关联的远程分支:
git branch -vv
五、tag管理
git tag
:查看已有taggit tag -a X.X.X -m "tag描述"
:新建taggit push origin X.X.X
:推送tag到远程