Git是一个开源的分布式版本控制系统,可以有效、高速地处理从很小到非常大的项目版本管理。也是Linus Torvalds为了帮助管理Linux内核开发而开发的一个开放源码的版本控制软件。一般情况下每个开发者的电脑上都有一个本地仓库,由大家共同向远程仓库去推送版本迭代信息。
Git的版本控制大致分为4个板块:
- 工作目录:存放我们正在写的代码(当我们新版本开发完成之后,就可以进行新版本的提交)
- 暂存区:暂时保存待提交的内容(新版本提交后会存放到本地仓库)
- 本地仓库:位于我们电脑上的一个版本控制仓库(存放的就是当前项目各个版本代码的增删信息)
- 远程仓库:位于服务器上的版本控制仓库(服务器上的版本信息可以由本地仓库推送上去,也可以从服务器抓取到本地仓库)
安装Git
下载安装包:https://git-scm.com/download/win
设定用户名和邮箱:
git config --global user.name "Your Name"
git config --global user.email "email@example.com"
基本命令
初始化一个新的仓库:
git init
克隆一个远程仓库到本地:
git clone remote_repository_url
添加文件到暂存区:
git add filename
提交文件到版本库:
git commit -m "commit message"
查看文件状态:
git status
查看提交历史:
git log
git log --graph
查看最近一次变更的详细内容:
git show
创建分支:
git branch branch_name
切换分支:
git checkout branch_name
合并分支:
git merge branch_name
拉取远程仓库最新内容:
git pull
推送本地提交到远程仓库:
git push
分支
创建分支:
git branch branch_name
查看所有分支:
git branch
切换分支:
git checkout branch_name
创建并切换到新分支:
git checkout -b new_branch_name
合并分支:
git merge branch_name
删除分支:
git branch -d branch_name
强制删除分支(未合并的分支):
git branch -D branch_name
查看分支合并情况:
git branch --merged
查看未合并的分支:
git branch --no-merged
查看冲突
git diff
变基分支
变基操作,它跟合并不同,合并是分支回到主干的过程,而变基是直接修改分支开始的位置
git rebase master
优选
还可以选择其将他分支上的提交作用于当前分支上,这种操作称为cherrypick:
git cherry-pick <commit id>:单独合并一个提交
远程仓库
将本地仓库中的内容推送到远程仓库:
git remote add 名称 远程仓库地址
git push 远程仓库名称 本地分支名称[:远端分支名称]
克隆项目
git clone 远程仓库地址
抓取、拉取和冲突解决
git fetch 远程仓库 #抓取:只获取但不合并远端分支,后面需要我们手动合并才能提交
git pull 远程仓库 #拉取:获取+合并
比如现在我们本地有两个仓库,一个仓库去修改hello.txt并直接提交,另一个仓库也修改hello.txt并直接提交,会得到如下错误:
To https://github.com/xx/xxx.git
! [rejected] master -> master (fetch first)
error: failed to push some refs to 'https://github.com/xx/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.
一旦一个本地仓库推送了代码,那么另一个本地仓库的推送会被拒绝,原因是当前文件已经被其他的推送给修改了,产生了冲突,因此需要解决冲突问题 。
如果远程仓库中的提交和本地仓库中的提交没有去编写同一个文件,那么就可以直接拉取,拉取后会自动进行合并,合并完成之后再提交即可:
git pull 远程仓库