Git的实践建议

经常更换/迁移开发环境,有时git的一些细节配置会对开发造成影响。这里记录下开发过程中遇到的一些问题或者小Tips。
(文章持续更新…)

忽略大小写敏感

经常会在IDE(Android Studio)遇到修改不了 大写命名的文件 名称,可配置git使文件名对大小写敏感。

git config core.ignorecase false

请确认工程的使用者

在不同pc上可能存在全局Git配置,在 git clone下项目之后最好通过

git config user.name

是否是当前正确的用户在操作工程项目。

动态更改 http/https 代理

1
2
3
4
git config --global http.proxy xxxxx
git config --global https.proxy xxxxx
git config --system (或 --global 或 --local) --unset http.proxy
git config --system (或 --global 或 --local) --unset https.proxy

处理Github没有记录Contributions

在别人的PC上 git clone 自己项目进行膝盖,发现push之后看不到自己的 Contributions。后来发现该 commits 不符合条件,原因是 commits 使用的email账户与项目对应的Github账号不一致。

  1. 排查问题

    使用 git log 查本地提交记录发现,commit 记录的邮箱不是对应我项目的账号邮箱。

  2. 修改repo的Git记录

    在本地拉全新的临时项目: git clone yourRepo

    创建一个修改脚本: touch modify_repo.sh

    写入以下脚本信息,并替换内容.

    git filter-branch –env-filter ‘
    OLD_EMAIL= <旧的Email地址>
    CORRECT_NAME= <正确的用户名>
    CORRECT_EMAIL= <正确的邮件地址>
    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

    运行脚本修改记录: ./modify_repo.sh //或 bash modify_repo.sh

    查看修改后的Git记录,并推送到远端仓库

    1
    2
    git log
    git push --force --tags origin 'refs/heads/*'
删除临时项目

1
2
cd ../
rm -rf <git repo>

如何把已提交的commit放到另一个分支

如果在分支A中 commit 了记录 A , 然后切换到分支 B 中,可使用 cherry-pick 指令迁移 commit 记录 。
根据 git 文档记录 “Apply the changes introduced by some existing commits”, 即修改已经存在的 commit 记录 。 使用以下指令处理 :

1
git cherry-pick <commit id>

用例说明 :

1
2
3
4
5
6
git checkout a
...
git add *
git commit -m "something commit"
git checkout b
git cherry-pick <commit id>

tag对发版分支的应用

1
2
git tag -a v1.7.0 -m "备注信息"
git push origin <tag_name>

更改本地和远端分支名

1
2
3
git branch -m old_branch new_branch # Rename branch locally 
git push origin :old_branch # Delete the old branch
git push --set-upstream origin new_branch # Push the new branch, set local branch to track the new remote

重新关联远端分支

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
git remote rm origin 可以删除关联
git remote add origin https://xxx.git 添加
git push -u origin <branch> 建立关联

git pull
There is no tracking information for the current branch.
Please specify which branch you want to merge with.
See git-pull(1) for details

git pull <remote> <branch>

If you wish to set tracking information for this branch you can do so with:

git branch --set-upstream-to=origin/<branch> modules

git branch --set-upstream-to=origin/modules modules
Branch modules set up to track remote branch modules from origin.

push/pull的默认行为

1
2
3
4
5
6
7
如果 checkout 远端分支 出一个新分支,则新分支的 merge 就会指向远端分支
如果 checkout 本地分支 出一个分支并推到远端,则新分支 merge 就是自己
git push [remote-repository-name] [branch-name]
git push 则会自动跟踪 clone 的时候对应的 origin 分支
git pull [remote-repository-name] [branch-name]
git pull = git fetch + git merge FETCH_HEAD
这里好留意 merge 的是什么分支,可以通过 cat .git/config 查看。

修复 bug 流程

修复bug的时候,可以用stash保存当前开发分支的状态,然后切换到,从创建并切换到该分支,修复完之后切换进行合并,最后删除,合并模式为普通模式

使用 git reset -hard 来恢复错误操作

通过 git log 查看提交的信息,我们 git reset –hard 来恢复到某一次提交的状态。 此时如果我们如果 git log 可能发现会丢失一些提交,使用 reflog 可以找回这些丢失的东西。 通过 git reflog 重新获取所有 HEAD 历史信息,再重新 git reset –hard 恢复即可。

善用 git stash 来管理保存进度

当有紧急的内容需要修改时,新功能可能还开发未完成,使用 git stash 保存当前进度。 git stash list 可以查看进度列表, git statsh pop 可以恢复同时删除该进度。 git stash drop <id> 丢掉一个进度, git stash clear 清除所有进度。

更新记录

2018/03/02 新增修改 repo 的 Git 记录
2018/05/24 新增把已提交的 commit 放到另一分支
2018/07/21 新增 bug 修复流程
2019/06/19 更新一波操作
2019/08/21 更新一波操作