Git多人协作
添加SSH
首先安装完之后配置git
git config --global user.name "your_name"
git config --golbal user.email "your_email"
首先进入到自己电脑里的.ssh
目录,查看目录下有没有id_rsa
(不能泄露)和id_rsa.pub
文件,如果有了就不需要运行下面的命令,如果没有运行下面的命令生成SSH Key,其中mail是你的邮箱
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上的lee2020spring仓库关联起来,由于现在GitHub的默认源代码仓库名为main,因此用git branch -M main
将master修改为main。
之后由于本地和远程的内容不同步,而且我们在远程创建了一个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时使用,其他时候可以不用
命令汇总
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 rm a.txt
修改和添加某个文件使用git add a.txt
命令汇总
git add -A # 提交所有变化
git add -u # 提交被修改modified和被删除deleted的文件,不包括新文件new
git add . # 提交新文件new和被修改modified的文件,不包括被删除的文件deleted
创建分支
一般来说我们希望main分支的内容都是正确的,然后每次多人进行修改时都分别在各自的分支进行修改,如果修改完毕在将main分支merge过来,
一开始的时候只有mater分支每次提交master都会向前移动一步,在这个过程中HEAD始终指向master
- 1-->2-->3(master)
当我们创建新的分支(dev)时,指向master,再把HEAD指向dev,表示当前分支在dev上
- 1-->2-->3(master, dev)-->4
- 1-->2-->3(master)-->4(dev)
当在dev的工作完成时,把dev合并到master上,直接将master指向dev即可,合并完后就可以删除dev分支了,只剩下master
- 1-->2-->3-->4(master, dev)
- 1-->2-->3-->4(master)
git checkout -b 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 # 查看提交记录
Git的具体应用场景
- 创建版本库并且提交
git init # 初始化
git add <file> # 将文件添加到stage
git commit -m "info" # 将文件提交到版本库
- 查看work的状态
git status
- 查看文件修改内容
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^^ # 回退到上上个版本
git reset --hard HEAD~100 # 回退到上100个版本
git reset --hard <version id> # 回退到某个版本
- 在未commit之前撤销修改
# 1. 修改后未提交到stage,撤销会回到和版本库一样的状态
git checkout -- <file>
# 2. 修改后提交到了stage,然后在工作区又做了修改,撤销会回到添加到stage后的状态,即与stage的内容一致
git checkout -- <file>
- 将stage的文件撤回
git reset HEAD <file>
如果将stage的文件撤回后,想继续放弃在work里面的更改,使用第六条git checkout -- <file>
命令
- 添加文件用add,删除用rm
# 如果将work处的某个文件删除了,使用如下命令
git rm <file>
git commit -m "info"
- 创建SSH
# 创建完后ssh在.ssh文件中
ssh-keygen -t rsa -C "your_email"
- 将本地内容推到GitHub上
# 1. 在GitHub上创建一个同名仓库
# 2. 将本地仓库与GitHub上的仓库关联
git remote add origin git@github.com:<your_name>/<repos_name>.git
# 3. 将本地内容推到远程仓库,-u只在第一次推时使用,作用是将main内容推到远程main分支,并将本地main和远程main关联起来
# 注意在推到远程时必须保证二者的内容已经同步,在我第一次使用时由于远程仓库有一个md文件,没能同步,所以应该先用git pull --rebase origin main将远程的md拉到本地进行同步,然后使用push命令
git push -u origin main
- 创建并合并分支
# 1. 创建分支
git checkout -b dev # 创建dev分支并切换,等价于-->git branch dev && git checkout dev
git switch -c dev
# 2. 切换分支
git checkout main # 切换到main分支
git switch main
# 3. 合并分支
git merge dev # 合并dev分支(Fast-forward合并)
git merge --no-ff -m "merge_info" dev # 普通合并,会有commit提交记录
# 4. 删除分支
git branch -d dev # 删除dev分支
git branch -D dev # 强制删除dev分支
git branch # 查看当前分支
- 如果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
- 如果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>
- 多个人一起进行某个项目
在开发时,一般有多个分支,这里假设为两个,一个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分支
Q1:在别人进行提交之后如果你也进行了修改,无法提交怎么办?
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条解决