WXL's blog

Talk is cheap, show me your work.

0%

小组合作项目使用Git的合理姿势

正常流程

从远程clone过来的项目默认只有一个分支main:

1
git branch
1
*main

尽量在dev分支上进行开发,因为main分支要存放稳定的版本,所以克隆了之后大家首先新建一个dev分支并关联到远程的dev分支:

1
2
3
4
5
6
7
git switch -c dev origin/dev
# switch是切换的意思,即切换分支
# -c 表示没有dev分支就新建一个再切换
# 后面带了一个origin/dev,origin表示远程主机名,即origin/dev表示远程主机的dev分支,即github上的dev分支。
# 其实直接git switch -c dev是有含义的,而且通常用的更多,表示新建一个名为dev的本地分支并且切换到dev分支下。
# 这里多了一个远程分支在后面表示将本地分支dev和远程分支origin/dev关联起来。
# 如果这里没有关联远程分支origin/dev,也可以通过git branch --set-upstream-to=origin/dev dev来关联。

关联远程分支

这个dev分支就是大家可以进行提交的分支,main分支是稳定版本分支,我来合并,大家可以不用管。但是每一次打开这个git bash的时候都会默认是main分支,使用git switch dev就可以切换到dev分支。那么基本的分支弄好了大家如何修bug、提交代码呢?

需要大家再创建一个分支,刚刚不是创建了一个dev然后关联到远程仓库了吗?现在创建的分支不用关联,只有你自己知道,比如我创建一个feature1分支并切换过去:

1
git switch -c feature1

下面比如我将readme.txt文件添加了一行:

添加了一行

然后添加到暂存区:

1
git add readme.txt

然后切换到feature1分支,再将修改提交到本地仓库:

1
2
git switch feature1
git commit -m "add a line"

为什么需要切换到feature1分支呢?暂存区和工作区(BigDataProject文件夹)都是所有分支共享的,所以在哪里进行add操作都可以,但是commit操作会将暂存区里的修改一次性合并到本地仓库的对应分支上,所以需要切换到你想合并的分支下,我们不直接对dev分支进行操作,我们的思路是:直接对feature1分支进行操作,dev分支留在后面的修改全部弄完之后,将feature1合并到dev分支。

刚刚是进行了一个修改,当你将需要修改的内容全部修改完之后,需要提交到远程仓库之前,需要将feature1提交的修改合并到dev分支上:

1
2
3
4
# 先切换到dev分支上:
git switch dev
# 合并修改:
git merge --no-ff feature1

如果你对于feature1没有其他的使用价值了,就可以将这个分支删除了:

1
git branch -d feature1

好了,刚刚将修改提交到本地仓库dev了,下面提交到远程仓库github上:

1
git push origin dev  

提交之后可以去github上查看一下:

在github查看

?没变啊?

别急,这个是main分支下的状态,我们刚刚提交的是dev分支,所以切换一下:

dev分支

这就是我们理想中的流程,即成员需要做的就是自己创建分支,在里面“大闹天宫”,提交到本地仓库,然后合并到dev分支中,最后将这个dev分支的内容提交到远程的dev分支,而main分支的内容不需要弄,组长来解决就行。

提交代码的时候冲突

如果想下载最新的远程代码,但是自己在本地已经做了修改,此时直接git pull会报错,类似这样:

1
2
3
error: Your local changes to the following files would be overwritten by merge:
code/b/confirm.txt
Please commit your changes or stash them before you merge.

解决这个有以下几种方法:

  1. 先将你的修改提交到远程,然后在将远程的代码拉取过来(如果你对于代码没有实质性的修改不建议这样):

    1
    2
    3
    4
    5
    git add .
    git commit -m "xxx"
    git pull
    # 再提交:
    git push
  2. 强制将远程的拉取过来完全覆盖本地代码:

    1
    2
    git reset --hard
    git pull
  3. 先保存当前的状态,压入git栈,然后拉取代码,然后将之前的状态从git栈中恢复:

    1
    2
    3
    git stash 
    git pull
    git stash pop

【Reference】:
https://blog.csdn.net/lincyang/article/details/21519333

https://www.cnblogs.com/wufenfen/p/13804456.html

https://www.cnblogs.com/willingtolove/p/12163517.html

.git目录特别大

准备提交的时候发现传了很久,然后发现是.git目录特别大,具体是.git\objects\pack目录下的.pack文件很大。解决如下:

首先看看前3个最大的文件是哪些:

1
git rev-list --objects --all | grep "$(git verify-pack -v .git/objects/pack/*idx | sort -k 3 -n | tail -5 | awk '{print$1}')"

输出如下:

1
2
3
4
5
cddf9e7cff045fb02ed547c2274c9beee945d443 src/static/admin/simpleui-x/elementui/element-ui.common.js
6b497b3dbbfb94396eccdc9e9e32c43aec997f25 src/static/admin/simpleui-x/fontawesome-free-5.8.1-web/webfonts/fa-solid-900.svg
8bda98f70ee84992e32f3d2bdfc29618ca8c4f7e src/static/login/js/plugins/echarts/echarts-all.js
67459d9f9e802cd6f5d984eb53fafb6d19a2e034 src/static/admin/simpleui-x/fontawesome-free-5.8.1-web/webfonts/fa-brands-400.svg
134f22a7cc857cf70f67c9cd804eb803899017f4 dataset/UserBehavior.csv

我的.git目录有980MB,下面将关于dataset/UserBehavior.csv的记录全部清除:

1
git filter-branch --force --index-filter 'git rm -rf --cached --ignore-unmatch dataset/UserBehavior.csv' --prune-empty --tag-name-filter cat -- --all

然后依次执行下面几个指令:

1
2
3
4
5
rm -rf .git/refs/original/
git reflog expire --expire=now --all
git gc --prune=now
git gc --aggressive --prune=now
git push origin dev --force # 我的一个远程分支为dev

这样一套流程下来,我的.git目录就只有8MB了,如果还需要删除其他的,可以以自己的需要来删除。

行行好,赏一杯咖啡吧~