一、Git工作目录下文件的状态
git工作目录下对文件的修改(增加,删除,更新)会存在几种状态, 这些修改的状态会随着执行git的命令而发生变化
- git add (工作区 -> 暂存区)
- git commit (暂存区 -> 本地仓库)
- git push (本地仓库 -> 远程仓库)
二、第一次初始化操作
- git init
- git clone 仓库地址
- git add .
- git commit -m ‘first commit’
- git remote add origin 仓库地址
- git pull origin master
- git push origin master # -f 强推
一次简单的clone流程
-
新建本地仓库目录
-
ls cd 命令切换到新建的目录下
-
git clone 远端仓库地址
三、查看仓库当前的状态
- git status
四、查看历史记录
- git log 查看所有commit记录(SHA-A校验,作者名称,邮箱,提交时间,提交说明)
- git log -p -次数 查看最近多少次的提交记录
- git log –stat 简略显示每次提交的内容更改
- git log –name-only 仅显示已修改的文件清单
- git log –name-status 显示新增,修改,删除的文件清单
- git log –oneline 让提交记录以精简的一行输出
- git log –graph –all –online 图形展示分支的合并历史
- git log –author=作者 查询作者的提交记录(和grep同时使用要加一个–all–match参数)
- git log –grep=过滤信息 列出提交信息中包含过滤信息的提交记录
- git log -S查询内容 和–grep类似,S和查询内容间没有空格
- git log fileName 查看某文件的修改记录
五、分支相关操作
1、查看当前分支
- git branch -v
- git branch -r 查看远程分支
- git branch -a 查看本地及远程分支
2、创建分支
- git branch 分支名
3、切换分支
- git checkout 分支名
- git checkout -b 分支名 origin/基分支名 (指定分支创建并切换分支)
- git checkout -b 分支名 (基于当前分支创建并切换分支)
4、合并分支
-
git merge 分支名 #用于合并指定分支到当前分支
- 例如:将develop分支合入1.1.0分支:
- 切换分支到1.1.0
- 将develop分支合入1.1.0分支
- git merge develop
合并冲突 (产生原因:合并分支时,两个分支在同一个文件的同一个位置有两套完全不同的修改)
- 处理文件中冲突的地方
- 将解决完冲突的文件加入暂存区(add)
- 提交到仓库(commit)
- git merge --abort 合并过程中放弃合并时使用该命令
5、删除分支
- git branch -d 分支名 删除分支时, 需要做各种检查
- git branch -D 分支名 不做任何检查, 强制删除
六、文件相关操作
1、添加操作 (工作区 -> 暂存区)
- git add 文件名 将工作区的某个文件添加到暂存区
- git add . 将当前工作区的所有文件都加入暂存区
- git add -u 添加所有被tracked文件中被修改或删除的文件信息到暂存区,不处理untracked的文件
- git add -A 添加所有被tracked文件中被修改或删除的文件信息到暂存区,包括untracked的文件
- git add -i 进入交互界面模式,按需添加文件到暂存区
简单图解说明:
2、提交操作 (暂存区 -> 本地仓库)
基础操作:
- git commit -m '提交说明'
- git commit -a -m '提交说明' 跳过缓存区操作,直接把工作区内容提交到本地仓库
经常需要从一个分支选择性的合并到另一个分支,可使用cherry-pick实现:
- 单个commit合并 git cherry-pick commit_id
- 多个连续commit合并
- (包括两端) git cherry-pick commit_id..commit_idn
- commit_id到commit_idn之间,非闭包 git cherry-pick (commit_id..commit_idn]
- 挑选多个git cherry-pick commit_id commit_idx commit_idy
- 合并过程中依次解决冲突后,继续合并 git cherry-pick --continue
3、推送操作 (本地仓库 -> 远端仓库)
- git push origin 分支名 推送本地修改到远端分支
- git push --force origin 分支名 本地与远端有差异, 要强推时使用
- git push origin --delete 分支名 删除远端分支
4、回退操作
- git reset HEAD^ 恢复成上次提交的版本
- git reset HEAD^^ 恢复成上上次提交的版本,就是多个^,以此类推或用~次数
- git reset --soft:只是改变HEAD指针指向,缓存区和工作区不变;
如上图,soft参数是指将本地仓回滚到Y版本,但是暂存区和工作区保持不变。此时本地仓回滚到Y版本号commit完成的那一刻。
- git reset --mixed:修改HEAD指针指向,暂存区内容丢失,工作区不变;
这是默认参数。表示本地仓和暂存区,都回滚到Y版本号。工作区代码不受影响。
- git reset --hard: 修改HEAD指针指向,暂存区内容丢失,工作区恢复以前状态;
本地仓、暂存区、工作区,三区都回滚。
切记!!!工作区有未提交的代码时不要用这个命令,因为工作区会回滚,你没有提交的代码就再也找不回了。
-
使用场景1: 如何撤销上一次push?
此时用--soft参数比较合适,只回滚本地仓到上一个版本,然后通过git push -f命令,撤销上次的push,最后更改好代码后重新push。步骤如下---
就2步(可复制操作,注意改分支)
// ① 将本地仓回滚到上一个版本号
git reset --soft HEAD~1
// ② 通过-f命令,将回滚后的版本号强制推送上去,
// 相当于撤销了最新的push
git push origin 分支名 -f
// 修改代码
// 修改好后,重新add,commit,push即可。
-
使用场景2: 如何撤销一次commit?
如果要同时撤销暂存区的话,就用--mixed参数,如果要撤销工作区的修改就用--hard参数,否则用--soft最安全。
git reset --hard HEAD~1
// 慎用--hard参数,除非你知道你自己在做什么
5、贮藏操作
- 场景1: 想要切换分支,但是还不想要提交之前的工作,所以贮藏修改。
- 场景2: 远端有修改,本地也有修改, 拉取远端代码时先贮藏本地修改。
- git stash list 查看贮藏的内容
- git stash apply On branch master 将贮藏的内容应用到指定的分支
七、总结
Git工作流程图
命令如下
- clone(克隆): 从远程仓库中克隆代码到本地仓库
- checkout(检出): 从本地仓库中检出一个仓库分支
- add(添加): 在提交前先将代码提交到暂存区
- commit(提交): 提交代码到本地仓库
- fetch(抓取): 从远程库抓取到本地仓库, 不进行任何的合并操作
- pull(拉取): 从远程库拉取代码到本地库, 自动进行合并(merge)
- push(推送): 将修改后的代码推送到远程仓库