2022-10-10-git常用操作

git 常用操作指令

1. Tag 管理

$ git tag // 查看本地tag
$ git ls-remote --tag // 查看远程所有标签
$ git tag v1.1.0 // 给当前分支打标签
$ git tag v1.0.0 039bf8b -m "add tags information" // 给特定的某个commit版本打标签,-m 可选
$ git tag -d v1.0.0 // 删除本地某个标签
$ git push origin -d v1.0.0 // 删除远程的某个标签
$ git push --tag // 将本地标签一次性推送到远程
$ git push origin v1.0.0 // 将本地某个特定标签推送到远程
$ git show v1.0.0 // 查看某一个标签的提交信息
$ git checkout 12345678 -b newBranch // 根据某个commit创建本地分支

2. git flow

git flow代码管理及分支创建合并

### https://www.atlassian.com/git/tutorials/comparing-workflows/gitflow-workflow
$ git flow init
$ git flow feature start feature_branch === git checkout develop && git checkout -b feature_branch
// 可用类型如下:feature / release / hotfix / support
$ git flow feature finish feature_branch === git checkout develop && git merge feature_branch

3. GIT 远程代码合并

3.1 下载需要合并的分支

$ git clone https://gitee.com/alingfly/ASF_Test.git

3.2 添加需要合并远程仓库

$ git remote add base https://github.com/AClumsy/ASF.git

base作为远程仓库,添加到 本地仓库(origin)中,设置别名为 base(自定义,这里我是为了方便区分仓库名)

3.3 把base远程仓库中数据抓取到本仓库

$ git fetch base  From https://github.com/AClumsy/ASF    * [new branch]      master     -> base/master

3.4 checkout切换到base分支上,命名为 asf

$ git checkout -b asf base/master  Switched to a new branch 'asf'  Branch 'asf' set up to track remote branch 'master' from 'base'.  //查看一下所有分支$ git branch * asf  asf_test

由于我们需要把asf分支合并到asf_test分支中去,我们在切换到asf_test分支。

$ git checkout asf_test

3.5 合并

$ git merge asf

合并完成之后会出现很多冲突,需要在本地代码中解决冲突,然后在提交到ASF_Test中去。

$ git push origin asf_test // 上传asf_test 分支到远程库

完整 分支同步过程

git clone 本地仓库(合并源)
git remote add base 期望被合并仓库
git fetch base
git push base v1.6
git remote rm origin

4. 不同分支 commit 同步

1. 切换到需要 合入 commit 的分支
2. cherry-pick 提交,并解决冲突后,push
$ git cherry-pick commitID

5. 常用代码指令

git log
git status
git add . 
git commit -m ""
// 设置别名
$ git config --global alias.co checkout
$ git config --global alias.ci commit
$ git config --global alias.br branch

. 更新 .gitignore 文件配置

# 删除git 缓存
git rm -r --cached .
git add .
git commit -m 'update .gitignore'

配置语法:
  以斜杠“/”开头表示目录;
  以星号“*”通配多个字符;
  以问号“?”通配单个字符
  以方括号“[]”包含单个字符的匹配列表;
  以叹号“!”表示不忽略(跟踪)匹配到的文件或目录;
  此外,git 对于 .ignore 配置文件是按行从上到下进行规则匹配的,意味着如果前面的规则匹配的范围更大,则后面的规则将不会生效;

7. 分支合并

$ git merge fixes enhancements // 合并分支`fixes``enhancements`在当前分支的顶部
$ git merge -s ours obsolete // 合并`obsolete`分支到当前分支,使用`ours`合并策略
$ git merge --no-commit maint // 将分支`maint`合并到当前分支中,但不要自动进行新的提交
$ git merge dev // 将分支`dev`合并到当前分支中,自动进行新的提交

# 定期合并 dev分支到 当前分支
$ git checkout feature/31124-190618 #切换到feature/31124-190618分支
$ git merge --no-ff develop #把dev代码合并大feature

8. Git 分支管理

# 查看本地分支
$ git branch
* master
# 创建分支

$ git branch testing
$ git branch
* master
  testing
# 分支切换,使用 git checkout -b (branchname) 命令来创建新分支并立即切换到该分支下
$ git checkout -b newtest
$ git checkout master

# 删除分支
$ git branch -d (branchname)

9. 子模块

git submodule update --init  //初始化版本
# 下载子项目
git submodule add https://e.coding.net/govindustry/hrss/hrss-web-comm.git src/hrss-web-comm
# 克隆项目后,默认子模块目录下无任何内容。需要在项目根目录执行如下命令完成子模块的下载:
git submodule init
git submodule update
# 或者
git submodule update --init --recursive

# 如果给 git clone 命令传递 --recurse-submodules 选项,它就会自动初始化并更新仓库中的每一个子模块, 包括可能存在的嵌套子模块。
git clone --recurse-submodules https://e.coding.net/govindustry/hrss/hrss-web-comm.git src/hrss-web-comm
git submodule update --remote  //更新到最新版本
#查看修改内容可以看到增加了子模块,并且新文件下为子模块的提交hash摘要
git diff --cached 

子模块的更新
子模块的维护者提交了更新后,使用子模块的项目必须手动更新才能包含最新的提交。

在项目中,进入到子模块目录下,执行 git pull更新,查看git log查看相应提交。

完成后返回到项目目录,可以看到子模块有待提交的更新,使用git add,提交即可。

删除子模块
有时子模块的项目维护地址发生了变化,或者需要替换子模块,就需要删除原有的子模块。

删除子模块较复杂,步骤如下:

rm -rf 子模块目录 删除子模块目录及源码
vi .gitmodules 删除项目目录下.gitmodules文件中子模块相关条目
vi .git/config 删除配置项中子模块相关条目
rm .git/module/* 删除模块下的子模块目录,每个子模块对应一个目录,注意只删除对应的子模块目录即可

10. 查看配置

查看用户名 :git config user.name
查看密码: git config user.password
查看邮箱:git config user.email
查看配置信息: $ git config --list  
# 修改所有的 name 和 email
$ git config --global --replace-all user.name "你的 git 的名称"
$ git config --global --replace-all uesr.email "你的 git 的邮箱"

注意: coding每一个团队下都需要配置一次 ssh公钥

image-20210827105306454

11. 无痕删除commit

# 1、查看提交日志
git log
# 2、然后执行如下的命令:
git rebase -i commit号
# 3.然后将要删除的 commit号 的前缀 `pick` 改为 `drop`。(最顶部)
pick xxx =》 drop xxx
# 4.然后可以通过如下命令再次查看是否已经删除:
git log
# 5.最后通过如下命令将现在的状态推送到远程仓库即可:
git push origin HEAD --force

https://cloud.tencent.com/developer/article/1511875

  • 删除最后一条提交

    git reset --soft HEAD~1
    // HEAD^的意思是上一个版本,也可以写成HEAD~1
    //如果你进行了2次commit,想都撤回,可以使用HEAD~2
    

    ``` js –mixed 意思是:不删除工作空间改动代码,撤销commit,并且撤销git add . 操作 这个为默认参数,git reset –mixed HEAD^ 和 git reset HEAD^ 效果是一样的。

–soft
不删除工作空间改动代码,撤销commit,不撤销git add .

–hard 删除工作空间改动代码,撤销commit,撤销git add .

注意完成这个操作后,就恢复到了上一次的commit状态。

顺便说一下,如果commit注释写错了,只是想改一下注释,只需要: git commit –amend

此时会进入默认vim编辑器,修改注释完毕后保存就好了。

### 12.还原本地分支

git fetch –all origin/master为想恢复的分支名称,这里是github默认主分支 git reset –hard origin/master git最新改版变成下面,弃用master改为main git reset –hard origin/main git pull


### 13. 删除分支

删除本地分支大写的 D

git branch -D 要删除的分支名

批量清理本地分支

git branch | grep ‘qa’ | xargs git branch -d

删除远程分支

git push origin –delete 要删除的分支名

批量删除远程分支

cd .git/refs/remotes/ 删除origin文件夹


### 删除变基操作

rm -fr ".git/rebase-merge"

### Q&A
1、错误 Error: spawn git ENOENT

// 设置 git 报错 I also get the error. In the settings.json of vscode:

“git.path”: “/user/bin/git”


### 忽略文件提交 更改后,需清除本地缓存
如下:

git rm –cache ./public/env.config.js ```