Git——常见问题
rehoni / 2022-02-16
1、查看和修改当前project的用户名、密码
git config user.name & user.email
2、本地已创建分支dev,要推送到远程分支
在远程分支中创建一个dev,利用 git push origin dev:dev
推送到远程,这样有一个坏处,如果未设置1️⃣中的user,则会以本地计算机或global中的信息推送过去。
故可以考虑commit之后直接push,git会提醒你push没有上游,采用git branch -u origin/dev
来设置本地dev的上游为远程的origin/dev。
3、本地仓库推送到远程GitHub
新建本地仓库关联
- 在需要建立本地仓库的位置调出git bash
- 输入git init,初始化本地仓库
- 输入git remote add origin 仓库地址, 添加远程仓库
- 如果远程仓库中有提交历史,输入git pull origin master,将提交历史和文件拉到本地仓库,有冲突解决冲突
- 输入git add,git commit,将文件存入本地仓库
- 输入git push -u origin master,将之前已commit的本地仓库文件推到远程仓库
已有本地仓库关联
- 在需要关联的本地仓库位置调出git bash
- 没有已关联的远程仓库则输入git remote add origin 仓库地址, 添加远程仓库,有则输入 git remote set-url origin 新地址
- 如果远程仓库中有提交历史,本地仓库也有,则输入git pull origin master –allow-unrelated-histories,合并两个项目不关联的历史
- 输入git push -u origin master,将本地仓库的commit推到远程仓库
注:origin和master根据需要替换,一般创建远程仓库时默认仓库别名是origin,默认分支是master。
再记录一下https设置用户名,密码步骤,不用每次有远程操作都要输入:
在本地仓库中调出git bash,输入git config credential.helper store,再输入git push就可以了
合并分支到master上
https://blog.csdn.net/boysky0015/article/details/78185879
4、关于记住密码、多项目不同用户
git config credential.helper store
5、更正Git历史修改commit记录
-
打开Git bash
-
创建存储库的全新裸克隆
git clone --bare <https://github.com/user/repo.git> cd repo.git
-
复制粘贴脚本,替换变量
- OLD_EMAIL
- CORRECT_NAME
- CORRECT_EMAIL
#!/bin/sh git filter-branch --env-filter ' OLD_EMAIL="your-old-email@example.com" CORRECT_NAME="Your Correct Name" CORRECT_EMAIL="your-correct-email@example.com" if [ "$GIT_COMMITTER_EMAIL" = "$OLD_EMAIL" ] then export GIT_COMMITTER_NAME="$CORRECT_NAME" export GIT_COMMITTER_EMAIL="$CORRECT_EMAIL" fi if [ "$GIT_AUTHOR_EMAIL" = "$OLD_EMAIL" ] then export GIT_AUTHOR_NAME="$CORRECT_NAME" export GIT_AUTHOR_EMAIL="$CORRECT_EMAIL" fi ' --tag-name-filter cat -- --branches --tags
-
执行脚本
-
查看新的Git历史记录是否有错误。
-
将更正的历史记录推送到GitHub:
git push --force --tags origin 'refs/heads/*'
-
清理临时克隆
cd .. rm -rf repo.git
5、拉取远程分支代码
git clone
了master
分支的代码下来,但是需要拉取其他远程分支的代码,采用git branch -r
查看远程分支列表,如想要拉取,则可以通过git branch -t origin/dev
或者git checkout -b dev origin/dev
拉取同远程分支名同名的分支到本地。
6、合并仓库并且保留commit log message记录
- 将repo1作为远程仓库,添加到repo2中,设置别名为other
- 从repo1仓库中抓取数据到本仓库
- 将repo1仓库中抓取的master分支作为新分支checkout到本地,新分支命名为repo1
- 切换为repo2的master分支
- 将repo1合并入master分支
注意:产生的文件冲突需要解决提交后才能merge,merge时需要添加参数--allow-unrelated-histories
git remote add other ../repo1/
git fetch other
git checkout -b repo1 other/master
git checkout master
git merge repo1 --allow-unrelated-histories
7、递归子模块
https://www.cnblogs.com/hexiaobao/p/8134829.html
https://www.dokyme.cn/index.php/2017/09/04/git/
8、分支的创建和合并 (十分详细)
https://git-scm.com/book/zh/v1/Git-分支-分支的新建与合并
https://www.dokyme.cn/index.php/2017/09/07/git-2/
9、取消一个目录的git化
rm -rf .git
将git分支branch合并到主干master上https://blog.csdn.net/sinat_39150454/article/details/77816179
修改git的config配置http://daemon369.github.io/git/2015/03/11/setting-email-in-git
Git bash配置代理
10、同一个 Github 账号之多台电脑间协同开发
https://blog.csdn.net/u013477973/article/details/80820882
11、Git bash快捷键
https://blog.csdn.net/xianghongai/article/details/79029357
12、Git变基操作
https://git-scm.com/book/zh/v2/Git-分支-变基
13、统计git提交次数+区域时间内提交次数+提交行数
统计git提交次数: 所有人的所有提交次数,会展示所有的提交人 提交次数详情。
git log | grep "^Author: " | awk '{print $2}' | sort | uniq -c | sort -k1,1nr
统计时间内提交次数。
git log --author=yourname --since="2017-08-01" --no-merges | grep -e 'commit [a-zA-Z0-9]*' | wc -l
git log --author="罗皓" --since="2023-01-01" --no-merges | grep -e 'commit [a-zA-Z0-9]*' | wc -l
统计提交行数:根据1展示出详情,可以填入username。将展示该用户增加行数,删减行数,剩余行数。
git log --author="罗皓" --since="2023-01-01" --pretty=tformat: --numstat | awk '{ add += $1; subs += $2; loc += $1 - $2 } END { printf "added lines: %s, removed lines: %s, total lines: %s\\n", add, subs, loc }' -
14、pull 分支报错 fatal: Need to specify how to reconcile divergent branches.
报错信息
➜ fisher git:(test) git pull origin test
From git.woa.com:wxg-bigdata/fisher
* branch test -> FETCH_HEAD
hint: You have divergent branches and need to specify how to reconcile them.
hint: You can do so by running one of the following commands sometime before
hint: your next pull:
hint:
hint: git config pull.rebase false # merge (the default strategy)
hint: git config pull.rebase true # rebase
hint: git config pull.ff only # fast-forward only
hint:
hint: You can replace "git config" with "git config --global" to set a default
hint: preference for all repositories. You can also pass --rebase, --no-rebase,
hint: or --ff-only on the command line to override the configured default per
hint: invocation.
fatal: Need to specify how to reconcile divergent branches.
分析:这是由于你拉取pull分支前,进行过merge合并更新分支操作,导致版本不一致,没有设定策略。
第一种解决方法:
- 执行
git config pull.rebase false
- 默认将pull下来的代码与现有改动的代码进行合并
- 但是可能会造成代码冲突,需要处理下这个问题
第二种解决方法:回退到合并之前的代码,在进行pull拉取最新代码
注意:这种解决方法适用于2个分支之间的merge操作,比如test分支回退版本,那test上合并的代码会丢失,等你test分支能成功pull后,需要重新merge开发分支上的代码合并到test上。所以记得保留这个版本的代码再回退到上一个版本,等pull成功,再重新合并代码
- 查看最近3次提交的历史版本
➜ fisher git:(test) git log -3 # 查看最近3次提交的历史版本
commit da20b931f4e04a61f0f9b4e4726a2e907e566fc9 (HEAD -> test)
Merge: 33df706e 6018c237
Author: v_isiliu <v_isiliu@tencent.com>
Date: Wed Jan 19 09:58:40 2022 +0800
Merge branch 'feture/tapd#870810123' into test
commit 6018c237278f5265e78314049d6642e493ebdb5e (feture/tapd#870810123)
Author: v_isiliu <v_isiliu@tencent.com>
Date: Wed Jan 19 09:57:50 2022 +0800
feat: 发布版本'feture/tapd#870810123'
commit 33df706e780d10af6435bda1fee85430604eebfc
Merge: 1d06cd1f 7589979d
Author: v_isiliu <v_isiliu@tencent.com>
Date: Tue Jan 18 16:11:21 2022 +0800
Merge branch 'feature/date#0118' into test
12345678910111213141516171819202122
- 回退到上一个版本
➜ fisher git:(test) git reset --hard 33df706e780d10af6435bda1fee85430604eebfc
HEAD is now at 33df706e Merge branch 'feature/date#0118' into test
12
- 再进行pull更新分支
➜ fisher git:(test) git pull origin test
15、git分支管理
作者:阮一峰
一、主分支Master
首先,代码库应该有一个、且仅有一个主分支。所有提供给用户使用的正式版本,都在这个主分支上发布。
Git主分支的名字,默认叫做Master。它是自动建立的,版本库初始化以后,默认就是在主分支在进行开发。
二、开发分支Develop
主分支只用来分布重大版本,日常开发应该在另一条分支上完成。我们把开发用的分支,叫做Develop。
这个分支可以用来生成代码的最新隔夜版本(nightly)。如果想正式对外发布,就在Master分支上,对Develop分支进行"合并"(merge)。
Git创建Develop分支的命令:
git checkout -b develop master
将Develop分支发布到Master分支的命令:
# 切换到Master分支
git checkout master
# 对Develop分支进行合并
git merge –no-ff develop
这里稍微解释一下,上一条命令的–no-ff参数是什么意思。默认情况下,Git执行"快进式合并"(fast-farward merge),会直接将Master分支指向Develop分支。
使用–no-ff参数后,会执行正常合并,在Master分支上生成一个新节点。为了保证版本演进的清晰,我们希望采用这种做法。关于合并的更多解释,请参考Benjamin Sandofsky的《Understanding the Git Workflow》。
三、临时性分支
前面讲到版本库的两条主要分支:Master和Develop。前者用于正式发布,后者用于日常开发。其实,常设分支只需要这两条就够了,不需要其他了。
但是,除了常设分支以外,还有一些临时性分支,用于应对一些特定目的的版本开发。临时性分支主要有三种:
* 功能(feature)分支
* 预发布(release)分支
* 修补bug(fixbug)分支
这三种分支都属于临时性需要,使用完以后,应该删除,使得代码库的常设分支始终只有Master和Develop。
四、 功能分支
接下来,一个个来看这三种"临时性分支"。
第一种是功能分支,它是为了开发某种特定功能,从Develop分支上面分出来的。开发完成后,要再并入Develop。
功能分支的名字,可以采用feature-*的形式命名。
创建一个功能分支:
git checkout -b feature-x develop
开发完成后,将功能分支合并到develop分支:
git checkout develop
git merge –no-ff feature-x
删除feature分支:
git branch -d feature-x
五、预发布分支
第二种是预发布分支,它是指发布正式版本之前(即合并到Master分支之前),我们可能需要有一个预发布的版本进行测试。
预发布分支是从Develop分支上面分出来的,预发布结束以后,必须合并进Develop和Master分支。它的命名,可以采用release-*的形式。
创建一个预发布分支:
git checkout -b release-1.2 develop
确认没有问题后,合并到master分支:
git checkout master
git merge –no-ff release-1.2
对合并生成的新节点,做一个标签
git tag -a 1.2
再合并到develop分支:
git checkout develop
git merge –no-ff release-1.2
最后,删除预发布分支:
git branch -d release-1.2
六、修补bug分支
最后一种是修补bug分支。软件正式发布以后,难免会出现bug。这时就需要创建一个分支,进行bug修补。
修补bug分支是从Master分支上面分出来的。修补结束以后,再合并进Master和Develop分支。它的命名,可以采用fixbug-*的形式。
创建一个修补bug分支:
git checkout -b fixbug-0.1 master
修补结束后,合并到master分支:
git checkout master
git merge –no-ff fixbug-0.1
git tag -a 0.1.1
再合并到develop分支:
git checkout develop
git merge –no-ff fixbug-0.1
最后,删除"修补bug分支":
git branch -d fixbug-0.1
(完)
16、修改远程分支名称
注:修改远程分支先拉下来再进行以下步骤
- 旧分支:oldBranch
- 新分支:newBranch
步骤:
-
先将本地分支重命名
git branch -m oldBranch newBranch
-
删除远程分支(远端无此分支则跳过该步骤)
git push --delete origin oldBranch
-
将重命名后的分支推到远端
git push origin newBranch
-
把修改后的本地分支与远程分支关联
git branch --set-upstream-to origin/newBranch
17、git回滚
1、回滚到之前某一版本且该版本后的提交都不需要
1)首先使用git log命令查看版本号(commit后就是版本号)
commit 91089df9cc4581d82d454a16fc15b8501d239128
2)git reset –hard 版本号 回滚到之前某版本,此时本地已经回滚,远程仓库还未回滚
3)git push -f 回滚远程仓库版本
2、回滚到之前某一版本但该版本后的提交仍需保留
1)首先使用git log命令查看版本号(commit后就是版本号)
2)git revert -n 版本号回滚到之前版本
3) git commit “备注信息” 提交
4)git push 推送至远程仓库
3、git commit但未push 把修改撤销到工作区中
使用 git reset –soft HEAD^ 命令,撤销了commit 代码依然保留