本文目录
在平时写代码的时候,一般除了实验室的电脑还有我自己的电脑,当在实验室写完东西之后,因为本身写的也不多所以直接用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的命令汇总
- 初始化仓库
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