一、前言
Git是目前世界上最先进的分布式版本控制系统。最近使用到了git命令,所以在这里记录一下git的一些基本操作
Workspace:工作区
Index / Stage:暂存区
Repository:仓库区(或本地仓库)
Remote:远程仓库
二、git操作
2.1 基本操作
1.在当前目录新建一个Git代码库
git init
2.git下载远程代码到本地(默认主分支)
git clone https://xxx.git
3.git下载指定分支代码到本地
git clone xxx.git --branch 分支名
4.git拉最新代码到本地
git pull <远程主机名> <远程分支名>:<本地分支名>
git pull origin shoubaiapp-gql_1-0-1719_BRANCH 将远程分支shoubaiapp-gql_1-0-1719_BRANCH代码更新到本地仓库对应的分支上(主分支或自建分支)
git pull origin master 将远程主机 origin 的 master 分支拉取过来,与本地当前分支合并
注: git pull --rebase origin master 等价于 git rebase origin/master
5.创建并切换分支——feature/vector_search是自定义的分支名
git checkout -b feature/vector_search
-
创建新分支:git branch branchName
-
切换到新分支:git checkout branchName
-
上面两个命令可以合成为一个命令:git checkout -b branchName
6.查看工作区代码相对于暂存区的差别
git status
7.查看某一个具体文件的修改
git diff dataUGC.html
8.执行当前工作区分支下的所有改动
git stash 执行存储
git stash pop 恢复之前缓存的工作目录,将对应修改应用到当前的工作目录下
9.撤销修改
git checkout -- .
10.撤销单个文件修改
git checkout -- index.html
11.回滚到最初的版本(强回最近一次的commit所提交的内容_不保留内容)
git reset --hard HEAD
12.手动删除文件
rm -rf 文件名
10.手动删除文件
2.2 提交操作
1.把要提交的所有修改放到暂存区—— . 代表当前目录
git add .
2.将缓存区内容添加到本地仓库
git commit -m '注释'
3.将本地版本库推送到远程服务器 —— origin是远程主机,feature/vector_search表示是远程服务器上的feature/vector_search分支,分支名是可以修改的
git push origin feature/vector_search
2.3 基于某个分支创建新分支
1.git下载远程代码到本地(默认主分支)
git clone https://xxx.git
注意:
下载分支代码到本地命令为:
git clone xxx.git --branch 分支名
2. cd 项目目录
3.根据已有分支创建新的分支
git checkout -b 新分支名 origin/原始分支名
4.将本地新增加的分支推送到远程服务器
git push origin 新分支名
2.4 将分支合并到主分支
1.从当前分支切换到主分支
git checkout master
注:master为主分支名字
2.将某个指定分支(feature/vector_search_v2)覆盖到当前分支——会自动完成git add git commit 等操作
git merge feature/vector_search_v2
3.推送到git服务器主分支(master)
git push origin master
三、git命令扩展
3.1 git clone 与 git pull区别
相同点:
-
都是从远程服务器拉取代码到本地
不同点:
-
git clone是在本地没有版本库的时候,从远程服务器克隆整个版本库到本地,是一个本地从无到有的过程
-
git pull是在本地有版本库的情况下,从远程库获取最新commit 数据(如果有的话),并merge(合并)到本地。git pull = git fetch + git merge
-
使用场景:
-
通常情况下,远程操作的第一步,是使用git clone从远程主机克隆一个版本库到本地。本地修改代码后,每次从本地仓库push到远程仓库之前都要先进行git pull操作,保证push到远程仓库时没有版本冲突
-
3.2 git push 命令详解
git push origin HEAD:refs/for/master
含义解释:
git push <remote 名字> <本地分支的名字> : <远程库的名字>
git push origin HEAD:refs/for/master
git push 肯定是推送
origin 远程的库的名字
HEAD 一个特别的指针,它是一个指向你正在工作的本地分支的指针,可以把它当做本地分支的别名,git这样就可以知道你工作在哪个分支
refs/for 意义在于我们提交代码到服务器之后是需要经过code review 之后才能进行merge的
refs/heads 不需要
3.3 git cr 命令详解
利用 git cr
命令代替git push origin HEAD:refs/for/远程分支
在终端中输入
git config --global alias.cr '!f() { : push ; r=$1; [[ -z $r ]] && r=origin; b=$2; t=$(git rev-parse --abbrev-ref HEAD); t=${t#refs/heads/}; [[ -z $b ]] && b=$t; cmd="git push $r HEAD:refs/for/$b"; echo $cmd; echo; $cmd; }; f'
检查是否写入git的全局配置文件
cat ~/.gitconfig
发现底部新增
[alias]
cr = "!f() { : push ; r=$1; [[ -z $r ]] && r=origin; b=$2; t=$(git rev-parse --abbrev-ref HEAD); t=${t#refs/heads/}; [[ -z $b ]] && b=$t; cmd=\"git push $r HEAD:refs/for/$b\"; echo $cmd; echo; $cmd; }; f"
日常使用使用git cr 代替冗长的git push origin XXX:refs/for/XXX命令
3.4 git cherry-pick 命令详解
git cherry-pick <commitHash>
// 将指定的提交(commit)应用于其它分支
-
commitHash
可以通过git log
查看
3.5 git rebase
git rebase master
git checkout master // 切换到本地master分支
git pull origin master // git pull <remoteName> <branchName>, 拉取远程master分支并更新本地
git checkout branchA // 切换到本地branchA分支
git rebase master // 变基,将本地master最新的代码合进本地的branchA分支。完成后,本地的branchA分支是最新的
git rebase origin/master
git fetch // download objects and refs from another repository
git rebase origin/master // 将远端master最新的代码合进本地的branchA分支
git rebase origin master(不要使用)
参考:
git rebase master 和 git rebase origin/master 的区别:https://blog.csdn.net/weixin_45346457/article/details/116210695
git rebase origin master 和 git rebase origin/master的区别:https://blog.csdn.net/shengzhu1/article/details/84836314
四、git命令一些实际应用
4.1 将未合入分支但已提交commit的代码改动应用到新分支上
示例:将branch1分支改动 (未合入分支,提交了commit) 应用到一个新分支branch2上
方法一:
基于改动分支提交的hash值(是个hash分支),在代码库生成新的分支(这样新分支就包含了这部分改动)
方法二:
1. 复制下载命令
git fetch ssh://******7526/1 && git checkout FETCH_HEAD
2. 在本地随便一个分支上执行该命令
3. 然后执行 git checkout -b branch2 命令
注意 branch2 是新分支名(可根据自己的分支名更改),本地不能事先存在该分支,存在的话,要先通过 git checkout -d 分支名称 命令进行删除
4. 这样本地的新分支 branch2 就有了 branch1 分支的改动,然后本地新分支 branch2 通过 git pull origin master --rebase 命令同步一下远程最新分支
5. 接着,在本地分支 branch2 上随便改动一点,然后git add、git commit、git push 提交即可,这样最终的远程分支 branch2 上就有了新的改动
4.2 分支合入失败
问题:在打分+2后,发现无法合入
解决办法:简单来说,就是通过 reset
命令删除此评审包含的所有commits,然后再重新提交
具体解决过程:
* 在本地仓库中,回滚本地的提交记录
* git fetch origin xxx(分支名)
* git reset --soft origin/xxx(分支名)
* 重新提交代码
* git add 文件名
* npm run commit
* git push origin HEAD:refs/for/xxx(分支名)
4.3 开发分支同步master出现冲突
假设当前开发分支为dev_xxx,dev_xxx与master存在冲突导致无法直接同步master代码
解决:
1. 基于master拉出开发分支 dev_xxx_1
2. 将dev_xxx分支merger至dev_xxx_1分支,手动解决合并过程中的冲突(这样dev_xxx_1分支既同步了master的代码,又有原来dev_xxx分支的代码)