Luo Hao

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

新建本地仓库关联

  1. 在需要建立本地仓库的位置调出git bash
  2. 输入git init,初始化本地仓库
  3. 输入git remote add origin 仓库地址, 添加远程仓库
  4. 如果远程仓库中有提交历史,输入git pull origin master,将提交历史和文件拉到本地仓库,有冲突解决冲突
  5. 输入git add,git commit,将文件存入本地仓库
  6. 输入git push -u origin master,将之前已commit的本地仓库文件推到远程仓库

已有本地仓库关联

  1. 在需要关联的本地仓库位置调出git bash
  2. 没有已关联的远程仓库则输入git remote add origin 仓库地址, 添加远程仓库,有则输入 git remote set-url origin 新地址
  3. 如果远程仓库中有提交历史,本地仓库也有,则输入git pull origin master –allow-unrelated-histories,合并两个项目不关联的历史
  4. 输入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记录

  1. 打开Git bash

  2. 创建存储库的全新裸克隆

     git clone --bare <https://github.com/user/repo.git>
     cd repo.git
    
  3. 复制粘贴脚本,替换变量

    1. OLD_EMAIL
    2. CORRECT_NAME
    3. 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
    
  4. 执行脚本

  5. 查看新的Git历史记录是否有错误。

  6. 将更正的历史记录推送到GitHub:

     git push --force --tags origin 'refs/heads/*'
    
  7. 清理临时克隆

     cd ..
     rm -rf repo.git
    

5、拉取远程分支代码

git clonemaster分支的代码下来,但是需要拉取其他远程分支的代码,采用git branch -r查看远程分支列表,如想要拉取,则可以通过git branch -t origin/dev或者git checkout -b dev origin/dev拉取同远程分支名同名的分支到本地。

6、合并仓库并且保留commit log message记录

  1. 将repo1作为远程仓库,添加到repo2中,设置别名为other
  2. 从repo1仓库中抓取数据到本仓库
  3. 将repo1仓库中抓取的master分支作为新分支checkout到本地,新分支命名为repo1
  4. 切换为repo2的master分支
  5. 将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合并更新分支操作,导致版本不一致,没有设定策略

第一种解决方法:

第二种解决方法:回退到合并之前的代码,在进行pull拉取最新代码

注意:这种解决方法适用于2个分支之间的merge操作,比如test分支回退版本,那test上合并的代码会丢失,等你test分支能成功pull后,需要重新merge开发分支上的代码合并到test上。所以记得保留这个版本的代码再回退到上一个版本,等pull成功,再重新合并代码

➜  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
➜  fisher git:(test) git pull origin test

15、git分支管理

作者:阮一峰

一、主分支Master

首先,代码库应该有一个、且仅有一个主分支。所有提供给用户使用的正式版本,都在这个主分支上发布。

Git主分支的名字,默认叫做Master。它是自动建立的,版本库初始化以后,默认就是在主分支在进行开发。

二、开发分支Develop

主分支只用来分布重大版本,日常开发应该在另一条分支上完成。我们把开发用的分支,叫做Develop。

img

这个分支可以用来生成代码的最新隔夜版本(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分支。

img

使用–no-ff参数后,会执行正常合并,在Master分支上生成一个新节点。为了保证版本演进的清晰,我们希望采用这种做法。关于合并的更多解释,请参考Benjamin Sandofsky的《Understanding the Git Workflow》

img

三、临时性分支

前面讲到版本库的两条主要分支:Master和Develop。前者用于正式发布,后者用于日常开发。其实,常设分支只需要这两条就够了,不需要其他了。

但是,除了常设分支以外,还有一些临时性分支,用于应对一些特定目的的版本开发。临时性分支主要有三种:

   * 功能(feature)分支

   * 预发布(release)分支

   * 修补bug(fixbug)分支

这三种分支都属于临时性需要,使用完以后,应该删除,使得代码库的常设分支始终只有Master和Develop。

四、 功能分支

接下来,一个个来看这三种"临时性分支"。

第一种是功能分支,它是为了开发某种特定功能,从Develop分支上面分出来的。开发完成后,要再并入Develop。

img

功能分支的名字,可以采用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-*的形式。

img

创建一个修补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、修改远程分支名称

注:修改远程分支先拉下来再进行以下步骤

  1. 旧分支:oldBranch
  2. 新分支:newBranch

步骤:

  1. 先将本地分支重命名

    git branch -m oldBranch newBranch
    
  2. 删除远程分支(远端无此分支则跳过该步骤)

    git push --delete origin oldBranch
    
  3. 将重命名后的分支推到远端

    git push origin newBranch
    
  4. 把修改后的本地分支与远程分支关联

    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 代码依然保留

git回滚到之前某次提交(本地+远程)_Ta是蒙蒙的博客-CSDN博客_git代码回滚到上一次提交