git基础命令
初始化仓库——git init
克隆现有的仓库 ——git clone <url>
将在工作区更改的文件 提交到 暂存区 ——git add 文件名
将暂存区的内容,添加到当前分支。——add commit -m "内容的描述"
了;
时刻掌握仓库当前的状态(比如改动那些文件,但是还没有提交add或者commit)——git status
用git status只能查看仓库的状态,但是查询不到具体修改了什么文件内容,需要用git diff
这个命令查看相较于上一次暂存都修改了些什么内容了(是工作区与已经commit或者暂存区的区别。) ——git diff
撤销对工作区修改,工作区的修改会消失。——git restore -- 文件名
用最近的git提交的版本,覆盖掉本地的工作区的修改。(git checkout其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”)—— git checkout -- 文件名
清空add命令向暂存区提交的关于file文件的修改(Ustage),这个命令仅改变暂存区,并不改变工作区。——git reset HEAD--文件名
版本回退,用HEAD
表示当前版本,上一个版本就是HEAD^
,上上一个版本就是HEAD^^
,当然往上100个版本写100个^
比较容易数不过来,所以写成HEAD~100
。——git reset --hard HEAD^
查看,当前分支的,所有的commit记录(从这个仓库创建起的所有commit记录)——git log
如果觉得git log 输出的信息很乱——git log --pretty=oneline
记录你的每一次命令(包括commit,切换分支等)——git reflog
关于HEAD 和 master
HEAD 会指向 master,master 指向最新的提交,所以,HEAD 指向的就是当前分支。
关于分支命令
git checkout -b 分支名
—— (-b)代表两个部分:1. git branch 分支名
。创建一个新的分支。2.git checkout 分支名
切换到某分支下面。
git switch -c 分支名
——代表两个部分:1. 创建分支。2. 切换分支git switch 分支名
。
git branch
—— 可以查看当前所有的分支(本地的),当前分支前面会标一个*
号。
git branch -r
—— 查看远程分支。
git branch -v
——查看远程分支。
git branch -a
——查看远程和本地分支。
git branch -vv
——查看远程和本地分支之间的关系。
git branch -d 分支名
—— 删除分支。
git merge 分支名
—— 用于合并指定分支到当前的分支。
合并代码
对于多分支的代码库,将代码 从 一个分支 转移到 另一个分支,有两种情况:
需要另一个分支的所有代码改动 使用
git merge
只需要部分的代码改动(某几个提交)
Cherry pick
git cherry pick <指定的commitHash>
就是将指定的commit提交,应用于其他分支。这会在当前分支产生一个新的提交,当然它们的哈希值会不一样。
git cherry-pick dev
命令的参数,不一定是提交的哈希值,分支名也是可以的,表示转移该分支的最新提交。(这句命令表示,将dev分支的最近一次提交,转移到当前分支。)
git cherry pick <hash1> <hash2>
这个命令将1和2的两次commit提交,都转移到当前分支。且会在当前分支生成对应两次新提交。
git cherry pick a..b
如果想要转移一系列的连续提交的简便语法。(这句的命令表示,可以转移从a到b的所有提交(注意不包括a,想要包括a,则使用git cherry pick a^..b
),他们必须按照正确的顺序放置:a早于b,否则命令将失败,但是不会报错。)
Cherry pick合并代码过程出现冲突
如果出现冲突,合并过程会停下来,让用户决定改怎么做。
git cherry-pick --continue
用户解决代码冲突后,第一步将修改的文件重新加入暂存区(git add .
),第二步使用git cherry-pick --continue
命令,让Cherry pick 过程继续执行。
git cherry-pick --abort
发生代码冲突后,放弃合并,回到操作前的样子。
git cherry-pick --quit
发生代码冲突后,退出cherry-pick,但不回到操作前的样子。
rebase操作
rebase 可以把本地未push的的分叉提交历史,整理成一条直线。
rebase的目的是使得我们在查看历史提交的变化时更容易,因为分叉的提交需要三方对比。
git 标签
发布一个版本时,我们通常先在版本库中打一个标签(
tag
),这样,就唯一确定了打标签时刻的版本。将来无论什么时候,取某个标签的版本,就是把那个打标签的时刻的历史版本取出来。所以,标签也是版本库的一个快照。
git 的标签虽然是版本库的快照,但其实它就是指向某个
commit
的指针(跟分支很像对不对?但是分支可以移动,标签不能移动),所以,创建和删除标签都是瞬间完成的。
git tag <标签名>
——首先,切换到需要打标签的分支上,然后就可以打一个标签了。默认的标签是打在最新提交的commit上的。
git tag
—— 可以查看所有标签。
git tag <标签名> <commitid>
——如果忘了打标签,找到对应的commitid即可。
git show <标签名>
——查看标签信息。
git tag -a <标签名> -m "描述" <commitid>
——可以创建带说明的标签,-a指定标签名 -m指定说明文字。
git tag -d <标签名>
—— 删除标签。(因为创建的标签都只存储在本地,不会自动推送到远程。所以,打错的标签可以在本地安全删除。)
git push origin <标签名>
—— 推送tag到远程。
git push origin --tags
—— 一次性推送全部尚未推送到远程的本地标签。
git tag -d <标签名>
+ git push origin :refs/tags/<标签名>
(从远程删除。删除命令也是push)
关于远程仓库
git remote
——查看远程仓库的名字
git remote -v
——查看fetch和push的地址
git remote show origin
——会连接网络,查看本地分支与远程仓库分支的对应情况
git fetch --prune
——可以把远程没有的,本地有的内容删除。git fetch不带参数只能把本地没有,而远程有的同步下来。
git fetch 和 git pull 的区别
git fetch 是将远程主机的最新内容拉到本地,由用户检查后决定是否合并到工作本机分支中。
git pull 是将远程主机的最新内容拉到本地后直接合并,
git pull = git fetch + git merge
,但可能产生冲突,需要手动解决。