前言:
git时每个开发必需掌握的技能,但很多工作对年,对git还是很懵,既熟悉又陌生。可视化的git工具用多了命令却不会敲,常用的命令就那几个,遇到问题又不会解决-。-
看完这篇你应该就没有git方面解决不了的问题了。
学习方法:一定要建一个私人仓库手撸一遍。

一、常用的Git命令
命令 | 说明 |
---|---|
git init | 初始化仓库 |
git config --global user.name "用户名" | 配置用户名 |
git config --global user.email "邮箱地址" | 配置邮箱 |
git config --list | 查看所有配置信息;后拼 --show-origin:可查所在文件的路径 |
git clone https://github.com/.../... | 下载拷贝远程仓库到本地仓库 |
git remote -v | 查看远程仓库地址 |
git add . | 添加当前目录下所有文件到暂存区 |
git add [File1] [File2] | 添加指定文件到暂存区 |
git add [dir] | 添加指定目录(包含其子目录)到暂存区 |
git commit | 将暂存区文件添加到本地仓库;-m “提交信息” |
git push | 将本地仓库的中的文件推送至远程仓库 |
git fetch | 从远程拉取最新commit id 到本地 |
git merge | 合并远程和本地的代码 |
git pull | 从远程获取最新版本并合并 |
git diff | 比较暂存区和工作区的差异,拉去远程代码后到工作区,可比较与暂存区之间的差异 |
git branch | 查看本地分支;-r :查看远程分支;-a:查看所有分支;-vv:查看本地关联的远程分支 |
git branch -m [当前分支名] [新分支名] | 重命名分支 |
git branch -d 本地分支 | 删除本地分支;-D:强制删除本地分支 |
git push --delete 远程分支 | 删除远程分支 |
git branch --set-upstream-to= 远程分支 | 跟远程分支做关联 |
git push --set-upstream 分支名 | 把本地分支推送到远程并关联 |
git push -u 分支名 | 关联远程分支,相当于git push origin分支名 + git branch --set-upstream-to=origin/分支名 |
git checkout 远程存在的分支 | 切换到远程分支到本地工作区 |
git checkout -b 本地分支名 | 从当前分支创建并切换到此分支 等同于 git branch branchName + git chekout branchName |
git checkout -b xxx(本地分支名) origin/xxx(远程分支名) | 创建xxx本地分支并关联指定的远程分支(从远程分支创建新的本地分支并检出) |
git log | 查看所有的提交信息;-- oneline:单行显示 |
git reflog | 查看所有分支的所有操作记录(包括已经被删除的commit记录和reset的操作,防止找回误删的提交) |
git status | 查看仓库当前的状态,显示有变更的文件,防止漏掉没添加的文件 |
git status --show-stash | 查看工作区中是否有stash暂存的东西,有则提醒该工作区有几个stash |
git stash | 将工作区修改的内容临时保存(多用于保存修改切换分支) |
git stash save "备注信息" | 将工作区临时保存时添加备注信息 |
git stash pop | 将临时保存的内容恢复 |
git reset HEAD | 重写HEAD之后的暂存区,工作区不受影响,方便合并成一个commit |
git revert | 放弃指定提交的修改,生成新的提交,以前的commit记录都在,合入有问题的提交,移除有问题的提交而不影响后面的提交 |
git rebase | 变基(重新定义起点) |
git rebase -i <commitHash>/git rebase HEAD ~1 | 变基当前分支上的commit,多用于合并多个commit(HEAD~1) |
git rebase --continue | 继续rebase操作(解决完冲突后,git add . + git rebase --continue) |
git rebase --abort | 终止rebase操作 |
git add . && git commit --amend --edit | 添加到暂存区并提交并不产生新的commit且编辑上次commit信息,--no-edit不重新编辑commit |
git tag -a <tagname> -m "标签信息" | 打版本tag |
git push -f | 强制推送到远程 |
git cherry-pick <commitHash> | 将一个分支上的提交转移到另一个分支上,后面加 --edit 打开编辑器 |
二、工作中的使用
1.创建目录并在该目录下使用 <git init> 初始化仓库
2.需要拉取的远程仓库地址,使用 <git clone https://xxx...> 拉取到本地
3.切换到指定分支 <git checkout 远程分支名>
4.运行无误后在此分支的基础上创建自己的分支,使用 <git checkout -b 自己的分支名>,此分支还没推送到远程
5.在自己的分支上开发,使用<git add .>来把工作区的代码添加到暂存区
6.暂存区的代码提交到本地仓库,使用<git commit -m"注释说明等信息">
7.在自己的本地分支上开发后需要推送到远程并与之关联,使用 <git push --set-upstream 自己的分支名>
8.可以通过<git branch -vv> 查看本地分支与远程的关联,确保关联正确
9.如果本地分支没有与远程关联,可以使用<git branch --set-upstream-to= 远程分支> 来关联
10.每次push前先pull一下需要push的远程分支,确保本地仓库跟远程仓库对齐,每次pull之前先通过<git status>命令来检查一下工作区的状态,确保没有未提交到本地仓库的内容
11.如果此分支多人使用,每次提交前需要先拉取一下代码,关联后直接使用<git pull>命令,未关联需要使用<git pull 远程分支>来拉取一下代码并解决冲突
12.pull 操作 也可以通过先使用 <git fetch 远程分支> 拉取最新代码,再通过使用 <git merge>来解决本地代码与远程代码之间的冲突,解决完<git add .> <git commit>提交
13.解决冲突也可以使用<git rebase>命令来进行,后面详解
14.开发过程中需要查看提交历史,可以使用<git log>/<git log --oneline>查看
15.需求开发完一个阶段需要合并成一个commit后提交,可以使用<git reset 本次需求第一次commit的hash> 然后add 、commit,记得在备份分支上做次操作,否则push不上去
16.合并成一个分支也可以通过使用<git rebase HEAD~最近几次提交>/<git rebase i 要合并的前一个commitHash>,进入编译器后在每个commitHash 前填入如下命令(通常是-f和-s)
pick:保留该commit(缩写:p)
reword:保留该commit,但我需要修改该commit的注释(缩写:r)
edit:保留该commit, 但我要停下来修改该提交(不仅仅修改注释)(缩写:e)
squash:将该commit和前一个commit合并(缩写:s)
fixup:将该commit和前一个commit合并,但我不要保留该提交的注释信息(缩写:f)
exec:执行shell命令(缩写:x)
drop:我要丢弃该commit(缩写:d)
若冲突需要解冲突,<git add .> <git rebase –continue>,出了问题想退回rebase操作之前,使用<git rebase --abort>终止rebase
17.若操作出了问题,想看一下之前的操作的步骤,可使用<git reflog>查看历史记录
18.开发中想切别的分支但又不想提交当前工作区的代码,可使用<git stash>临时保存起来,使用<git stash pop>来恢复
19.开发中你push远程前想在修改点东西,但不想重新commit,可以使用<git add . && git commit --amend --edit>来把当前改动添加到上一次的commit中
三、git rebase命令
3.1 通过git rebase与git merge 解决冲突的区别:
需要注意:如果提交存在于你的仓库之外,而别人可能基于这些提交进行开发,那么不要执行变基。 变基操作的实质是丢弃一些现有的提交,然后相应地新建一些内容一样但实际上不同的提交。 如果你已经将提交推送至某个仓库,而其他人也已经从该仓库拉取提交并进行了后续工作,此时如果你用
git rebase命令重新整理了提交并再次推送,你的同伴因此将不得不再次将他们手头的工作与你的提交进行整合,如果接下来你还要拉取并整合他们修改过的提交,容易引起分支混乱
3.1.1在dev分支上使用git merge命令后的节点结构。

3.1.2.在dev分支上使用git rebase 命令后的节点结构,可以整合分叉的历史。
将C4中的修改变基到C3上
git checkout experiment(检出测试分支)
git rebase master(把它变基到master分支上)

master分支的快进合并
git checkout master
git merge experiment

3.2 通过git rebase 合并多个commit(也可以使用git reset来合并多个提交)
git rebase -i HEAD~n(合并最近n条commit)/ git rebase -i commitHash(起始前一个commentHash)
进入编辑状态
pick:保留该commit(缩写:p)
reword:保留该commit,但我需要修改该commit的注释(缩写:r)
edit:保留该commit, 但我要停下来修改该提交(不仅仅修改注释)(缩写:e)
squash:将该commit和前一个commit合并(缩写:s)
fixup:将该commit和前一个commit合并,但我不要保留该提交的注释信息(缩写:f)
exec:执行shell命令(缩写:x)
drop:我要丢弃该commit(缩写:d)
修改每条commit开头的上面6种操作,可以缩写
解决冲突
git add .
git rebase --continue 继续执行
git rebase --abort 终止,回退到rebase 操作之前的状态
四、问题解决
现象一:游离状态
操作Git时终端出现这个信息 「HEAD detached」,则说明处于游离状态且无法commit,这时再切回之前的分支会发现代码可能会丢失。
解决办法(以dev分支为例):
- 1.在当前游离状态下新建一个临时分支来保存游离状态下的提交 git checkout -b temp
- 2.切换到开发分支 git checkout dev
- 3.更新dev代码并对merge临时分支 git pull、git merge temp; git status 查看冲突并解决冲突;add、push等操作`
- 4.删除临时分支 git branch -d temp;git log查看一下HEAD指向。
HEAD解释:相当于一个指针,通常指向当前所在分支的最新提交,当切换分支时,HEAD会指向切换后的分支的最新提交,如果切换到指定的某次提交,git checkout <commit id>,HEAD就会处于游离状态(detached状态)
网友评论