Git多人协作
在平时写代码的时候,一般除了实验室的电脑还有我自己的电脑,当在实验室写完东西之后,因为本身写的也不多所以直接用u盘copy了一份到自己的电脑上,如果没做完的话就回去在自己的电脑上做,但是之后发现当内容较多的时候就很麻烦,因此决定还是用Git来管理自己的文件
- 安装并配置Git
- 添加SSH
- 创建GitHub远程仓库,将其与本地相关联
- 创建分支
- 解决多人合作时的冲突问题
- 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
如果此时将本地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
git pull --rebase origin main
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
当我们创建新的分支(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 的,需要将冲突解决
git status
vim <file>
git branch -d dev
git log --graph --pretty=oneline --abbrev-commit
2. 如果main的项目还没结束,自己在dev分支上修改了一部分内容,突然发现了一个bug,然后需要先把bug修复在进行之后的工作
git stash
git checkout main
git checkout -b issue101
git add <file>
git commit -m "fix bug"
git switch master
git merge --no-ff -m "merge fix bug" issue101
git switch dev
git stash list
git stash pop
git cherry-pick <issue101_id>
3. 多个人一起进行某个项目
在开发时,一般有多个分支,这里假设为两个,一个main分支,一个dev分支,远程仓库的默认名称为origin。这里讲述了多个人一起协作时的流程
- main分支:主分支,时刻与远程同步
- dev分支:开发分支,成员都在上面工作,也要与远程同步
git clone git@github.com:harrytea/<repos_name>.git
git branch
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
git push origin dev
4. 在别人进行提交之后如果你也进行了修改,无法提交怎么办
git add <file>
git commit -m "info"
git push origin dev
git pull
git branch --set-upstream-to=origin/<dev> dev
git pull
六、Git的命令汇总
- 初始化仓库
git init - 配置用户名、邮箱和代理
用户名和邮箱 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 - 创建SSH
ssh-keygen -t rsa -C "your_email" - 提交到缓存区
提交文件git add a.txt 提交所有变化git add -A deleted文件git rm a.txt 提交modified和deleted的文件,不包括untrackedgit add -u 提交untracked和modified的文件,不包括deletedgit add . - 提交到工作区
git commit -m "info" - 查看在上次提交之后是否有对文件进行再次修改(-s简短输出)
git status (-s) - 查看某文件修改内容
git diff <file - 查看历史提交记录
git log 只输出一行git log --pretty=oneline 查看分支合并图git log --graph git log --graph --pretty=oneline --abbrev-commit 记录历史提交日志git reflog - 版本回退
回退到上个版本git reset --hard HEAD^ 回退到上上个版本git reset --hard HEAD^^ 回退到上100个版本git reset --hard HEAD~100 回退到某个版本 git reset --hard <version id> - 在未commit之前撤销修改
修改后未提交到stage,撤销会回到和版本库一样的状态 git checkout -- <file> 修改后提交到了stage,然后在工作区又做了修改,撤销会回到添加到stage后的状态,即与stage的内容一致git checkout -- <file> 将stage的文件撤回git reset HEAD <file> - 分支操作
查看当前分支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
|