Git多人协作

在平时写代码的时候,一般除了实验室的电脑还有我自己的电脑,当在实验室写完东西之后,因为本身写的也不多所以直接用u盘copy了一份到自己的电脑上,如果没做完的话就回去在自己的电脑上做,但是之后发现当内容较多的时候就很麻烦,因此决定还是用Git来管理自己的文件

一、安装Git

sudo apt-get install git

安装完之后配置git用户名和邮箱,用户名和邮箱地址是本地git客户端的一个变量,每次commit都会用用户名和邮箱纪录

git config --global user.name "your_name"
git config --golbal user.email "your_email"

# 查看用户名和邮箱
git config user.name
git config user.email

二、添加SSH

首先进入到自己电脑里的.ssh目录,查看目录下有没有id_rsa(不能泄露)和id_rsa.pub文件,如果有了就不需要运行下面的命令,如果没有运行下面的命令生成SSH Key,其中yourmail是你的邮箱

ssh-keygen -t rsa -C "yourmail@example.com"

文件中有了密钥之后,打开GitHub网站,在自己账户的SSH Keys选项下,将自己的公钥id_rsa.pub复制上去即可,此时GitHub已经添加了对本机的信任

三、创建GitHub仓库

首先在GitHub上创建一个仓库,添加一个md文件

本地上传

进入到本地要关联的文件夹中,运行git init初始化本地仓库为git可以管理的文件,然后运行git remote add origin git@github.com:your_name/your_repos.git将本地与GitHub上的<name>仓库关联起来,由于现在GitHub的默认源代码仓库名为master,因此用git branch -M main将master修改为main,此时如果修改失败原因是本地没有master分支,只需要git add -A git commit -m "commit_info",然后运行git branch即可看到master分支

如果此时将本地push到远程仓库,会报错,如下所示

error: failed to push some refs to 'github.com:xxx/xxx.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

这是因为远程仓库中有本地没有的信息(也就是那个readme.md文件),因此我们需要先将远程的md文件pull下来,运行git pull --rebase origin main,其中--rebase的意思是取消本地库中的commit,并将他们接到更新后的版本库之中,此时本地和远程已经同步,可以将本地的内容push到远程了,运行git add . git commit -m "first commit" git push -u origin main -u只有在第一次push时使用,-u只在第一次推时使用,作用是将main内容推到远程main分支,并将本地main和远程main关联起来

上述命令汇总

git init                         # 初始化仓库
git remote add origin git@github.com:your_name/your_repos.git  # 将远程仓库和本地关联起来
git branch -M main               # 将本地改为main
git pull --rebase origin main    # 将远程仓库的内容pull到本地(同步)
git add .                        # 将本地仓库内容添加到缓存区
git commit -m "first commit"     # 将缓存区的内容添加到工作区
git push -u origin main          # 将工作区的内容添加到远程仓库

注意,如果在git pull的时候出现错误,可能是你设置了VPN,此时应该配置一下代理
设置代理
git config --global https.proxy http://127.0.0.1:10808
git config --global http.proxy 'socks5://127.0.0.1:10809'
取消代理
git config --global --unset http.proxy
git config --global --unset https.proxy

四、创建分支

一般来说我们希望main分支的内容都是正确的(也就是每次上传时都是最终的结果),但是我们在修改的过程中难免会出现错误,比如我们把1写成了2,如果这时你把2提交到远程仓库,当别人pull时就是一个错误的结果,这显然不好。因此需要我们创建一个分支,每次多人进行修改时都分别在各自的分支进行修改,这样不影响main的结果,当修改完毕后将main分支merge过来

主要流程

一开始的时候只有main分支每次提交main都会向前移动一步,在这个过程中HEAD始终指向main

  • 1–>2–>3(main) # 只有main

当我们创建新的分支(dev)时,指向main,再把HEAD指向dev,表示当前分支在dev上

  • 1–>2–>3(main, dev) # 创建了一个dev分支
  • 1–>2–>3(main)–>4(dev) # 在dev上进行修改并提交

当在dev的工作完成时,把dev合并到main上,直接将main指向dev即可,合并完后就可以删除dev分支了,只剩下main

  • 1–>2–>3–>4(main, dev) # 将main分支合并
  • 1–>2–>3–>4(main) # 删除dev分支

git checkout -b dev创建并切换分支到dev,这时我们可以在dev分支上进行操作,当我们修改完之后进行commit,然后执行git checkout main切换到原分支,使用git merge dev将其合并,然后用git branch -d dev删除dev分支即可

注意:在合并分支时,如果使用git merge dev属于快速合并Fast-Forward,不会有commit记录,但是如果使用git merge --no--ff -m "commit" dev会关闭快速合并,使用git log --graph --pretty=oneline --abbrev-commit会在提交历史中看到合并的这一次提交

命令汇总

git branch             # 查看当前分支
git checkout -b dev    # 创建并切换分支
git switch -c dev
git checkout main	   # 切换分支
git switch main  
git merge dev          # 合并分支
git merge --no-ff -m "commit" dev
git branch -d dev      # 删除分支
git log --graph --pretty=oneline --abbrev-commit  # 查看提交记录

五、解决多人合作时的冲突问题

1. 如果main分支和dev分支同时进行了更改和commit

此时是没有办法进行git merge dev的,需要将冲突解决

# 1. 查看冲突发生在哪里
git status
# 2. 修改冲突
vim <file>
# 3. 删除分支
git branch -d dev
# 4. 查看分支合并图
git log --graph --pretty=oneline --abbrev-commit

2. 如果main的项目还没结束,自己在dev分支上修改了一部分内容,突然发现了一个bug,然后需要先把bug修复在进行之后的工作

# 流程: main(出了bug)- issue101(2. 回到main分支并创建新分支issue101)
#       dev(1. 目前正在dev进行了一部分工作)
# 1. 首先将现场存储
git stash      
# 2. 此时运行git status工作区是干净的,回到main分支并创建新分支issue101
git checkout main
git checkout -b issue101
# 3. 此时在issue101上修改自己的bug,然后进行提交
git add <file>
git commit -m "fix bug"
# 4. 回到main分支上merge完成bug的修改
git switch master
git merge --no-ff -m "merge fix bug" issue101
# 5. 回到最初的dev分支,恢复现场
git switch dev
git stash list  # 查看存储的工作现场
git stash pop   # 将现场恢复并删除之前保存的现场,等价于-->git stash apply && git stash drop
# 6. 修改dev的bug,之前issue101的bug代号记住,仅将这个修改merge到dev分支
git cherry-pick <issue101_id>

3. 多个人一起进行某个项目

在开发时,一般有多个分支,这里假设为两个,一个main分支,一个dev分支,远程仓库的默认名称为origin。这里讲述了多个人一起协作时的流程

  • main分支:主分支,时刻与远程同步
  • dev分支:开发分支,成员都在上面工作,也要与远程同步
# 1. 抓取分支
git clone git@github.com:harrytea/<repos_name>.git
git branch  # 只会显示一个分支main
# 2. 将远程的dev分支也抓取到本地,当对dev进行修改时,可以随时push到远程
git checkout -b dev origin/dev
git add <file>
git commit -m "info"
git push origin dev

# 命令
git remote      # 查看远程库的信息
git remote -v   # 查看远程库的详细信息
git push origin main    # 推送main分支
git push origin dev     # 推送dev分支

4. 在别人进行提交之后如果你也进行了修改,无法提交怎么办

git add <file>
git commit -m "info"
git push origin dev  # 推送失败
# 使用git pull将前一个人的最新提交抓下来,然后本地合并
git pull  # 可能会失败,因为dev和远程origin/dev没有连接
git branch --set-upstream-to=origin/<dev> dev
git pull  # 再次使用git pull,如果再出现了冲突,查看上面的12条解决

六、Git的命令汇总

  1. 初始化仓库git init
  2. 配置用户名、邮箱和代理
    用户名和邮箱
    git config --global user.name "your_name"
    git config --golbal user.email "your_email"
    查看用户名和邮箱
    git config user.name
    git config user.email
    设置代理
    git config --global https.proxy http://127.0.0.1:10808
    git config --global http.proxy 'socks5://127.0.0.1:10809'
    取消代理
    git config --global --unset http.proxy
    git config --global --unset https.proxy
  3. 创建SSHssh-keygen -t rsa -C "your_email"
  4. 提交到缓存区
    提交文件git add a.txt
    提交所有变化git add -A
    deleted文件git rm a.txt
    提交modified和deleted的文件,不包括untrackedgit add -u
    提交untracked和modified的文件,不包括deletedgit add .
  5. 提交到工作区git commit -m "info"
  6. 查看在上次提交之后是否有对文件进行再次修改(-s简短输出)git status (-s)
  7. 查看某文件修改内容git diff <file
  8. 查看历史提交记录git log
    只输出一行git log --pretty=oneline
    查看分支合并图git log --graph git log --graph --pretty=oneline --abbrev-commit
    记录历史提交日志git reflog
  9. 版本回退
    回退到上个版本git reset --hard HEAD^
    回退到上上个版本git reset --hard HEAD^^
    回退到上100个版本git reset --hard HEAD~100
    回退到某个版本 git reset --hard <version id>
  10. 在未commit之前撤销修改
    修改后未提交到stage,撤销会回到和版本库一样的状态 git checkout -- <file>
    修改后提交到了stage,然后在工作区又做了修改,撤销会回到添加到stage后的状态,即与stage的内容一致git checkout -- <file>
    将stage的文件撤回git reset HEAD <file>
  11. 分支操作
    查看当前分支git branch
    创建dev分支并切换git checkout -b dev git switch -c dev
    git branch dev && git checkout dev
    切换分支git checkout main git switch main
    合并分支(Fast-forward合并)git merge dev
    普通合并(有commit提交记录)git merge --no-ff -m "merge_info" dev
    删除分支git branch -d dev
    强制删除分支git branch -D dev
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值