注意
本文为本人原创,部分资料参考官网,仅为学习及技术分享所用,切勿用于商业用途,转载请注明出处。
1. 初始化
安装完Git之后,在您的机器上任一目录下运行以下命令,将该目录初始化为Git版本库
git init
2. 本地库操作
2.1 添加文件
首先添加文件,可反复多次使用,添加多个文件
git add <file1>
2.2 提交修改
提交到版本库,-m 参数设置注释
git commit -m "comment add new file"
2.3 查看工作区状态
工作区就是你的工作目录,版本库是你的工作目录下隐藏的.git文件夹中的内容,注意这两者的区别。
运行以下命令可以查看工作区状态(哪些文件修改了,哪些文件未提交,merge后是否存在冲突等)
git status
如果git status告诉你有文件被修改过,用git diff可以查看修改内容,即比较工作区文件内容与版本库HEAD版本中该文件内容的不同
git diff <file1>
2.4 查看提交日志
git log
这样输出信息会很多,可以试试加上--pretty=oneline参数简化输出
git log --pretty=oneline
查看所有命令操作记录
git reflog
2.5 回退
在Git中,用HEAD表示当前版本,上一个版本就是HEAD,上上一个版本就是HEAD,当然往上100个版本写100个比较容易数不过来,所以写成HEAD~100。
想要回退到上一个版本,可以尝试以下命令
git reset --hard HEAD^
想要回退到某一个版本,可以先用git log或者git reflog查看该版本对应的commit id,然后执行reset命令
git reset --hard <commit id>
Git的版本回退速度非常快,因为Git在内部有个指向当前版本的HEAD指针,当你回退版本的时候,Git仅仅是把HEAD指向想要回退到的那个版本对应的节点。
2.5 利用暂存区
初始化版本库后,git会为我们创建一个暂存区,所有我们用git add添加的文件都是先存到暂存区,当我们运行git commit命令才将暂存区中的内容一次性提交到分支上。
注意:Git管理的是修改而不是文件,每次修改,如果不git add到暂存区,那么这次修改在git commit时,是不会提交到分支的。事实上,我们经常可以多次git add将修改先放到暂存区,确认无误后,再一次性git commit提交。
2.6 撤消修改
撤消工作区中的修改
git checkout -- <file1>
git checkout其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除。
撤消已添加到暂存区中的修改
git reset HEAD <file1>
2.7 删除文件
在工作区中先将文件删除,然后从版本库中删除该文件
git rm -- <file1>
最后确认提交git commit,这样文件就从版本库中删除了。
3. 远程仓库操作
通常情况下,我们不仅仅要维护本地仓库,而且还要建立远程仓库,无论是在GitHub上创建这个远程仓库,还是自己搭建Git服务器。通过让这两个仓库进行远程同步,这样,远程仓库既可以作为备份,又可以让其他人通过该仓库来协作共同开发。
3.1 关联远程仓库
首先要确保你本机上的ssh公钥已经上传到远程仓库服务器上。
然后调用以下命令:
git remote add origin git@server-name:path/repo-name.git
server-name为远程仓库服务器域名或IP地址
path为远程仓库路径
repo-name为远程仓库名
添加后,远程库的名字就是origin,这是Git默认的叫法,也可以改成别的,但是origin这个名字一看就知道是远程库
3.2 推送本地仓库内容到远程仓库
第一次推送
git push -u origin master
这样不仅会将本地仓库master分支下全部内容推送到远程仓库,还会建立关联,为以后同步操作提供便利
之后推送就不用加-u参数了
git push origin master
Git分布式版本系统的最大好处之一是在本地工作完全不需要考虑远程库的存在,也就是有没有联网都可以正常工作,而SVN在没有联网的时候是拒绝干活的!当有网络的时候,再把本地提交推送一下就完成了同步!
3.3 克隆远程仓库到本地
首先必须知道仓库的地址,然后使用git clone命令克隆
git clone git@server-name:path/repo-name.git
3.4 查看远程仓库信息
git remote -v
3.5 从本地向远程仓库推送分支
本地新建的分支如果不推送到远程,对其他人就是不可见的;
从本地推送分支,使用git push origin branch-name,
git push origin <branch-name>
如果推送失败,先用git pull抓取远程的新提交
git pull
在本地创建和远程分支对应的分支,本地和远程分支的名称最好一致
git checkout -b <branch-name> origin/<branch-name>
建立本地分支和远程分支的关联,如果没有建交关联,git pull可能会失败。
git branch --set-upstream <branch-name> origin/<branch-name>
从远程抓取分支,使用git pull,如果有冲突,要先处理冲突。
4. 分支操作
4.1 创建分支并切换
git checkout -b <branch-name>
-b 参数表示创建完分支后直接切换到该分支
4.2 分支列表
git branch
列出所有分支,当前分支前面会标一个*号
4.3 切换分支
比如我们想切换回master分支
git checkout master
4.4 合并分支
合并指定分支到当前分支
git merge dev
一般情况下,我们会先切换回master分支,再指定分支合并到master分支。
4.5 删除分支
git branch -d dev
4.6 解决冲突
当我们合并分支时,经常会遇到两个分支上同一文件内容不一致引起的冲突。
诸如以下情况:
git merge dev
Auto-merging dev.txt
CONFLICT (content): Merge conflict in dev.txt
Automatic merge failed; fix conflicts and then commit the result.
git提示我们必须解决冲突后,再行提交。
我们可以运行git status查看具体冲突的文件内容
git status
Git用<<<<<<<,=======,>>>>>>>标记出不同分支的内容,我们将不需要的冲突内容删除,然后提交
git add dev.txt
git commit -m "confict fixed"
这样冲突就解决了。可以使用git log --graph 查看合并情况
git log --graph --pretty=oneline --abbrev-commit
4.7 分支合并模式
Git默认会用Fast forward模式进行分支合并,这种模式速度最快,但在删除分支后,会丢掉分支信息。
如果要强制禁用Fast forward模式,可以使用--no-ff 参数,Git就会在合并时生成一个新的commit,这样,通过git log可以从分支历史上就可以看出分支信息。
git merge --no-ff -m "merge with no-ff" dev
在实际开发中,master分支应该是非常稳定的,仅用来发布新版本。
开发都在dev分支上进行的,也就是说,dev分支是不稳定的,到某个时候,比如1.0版本发布时,再把dev分支合并到master上,在master分支发布1.0版本。
而团队中每个人都在dev分支上提交代码,那样管理会很混乱。可以每个人创建自己的分支,时不时地往dev分支上合并。
4.8 处理bug分支
实际工作中,经常会在开发某个新功能时被要求停下手头的工作,转而去修复前一个已发布的版本中的Bug。那这样手头上进行到一半的新功能开发怎么办呢?由于还未完全开发好,提交上去又有可能影响其他功能的测试。Git提供了一个stash功能,用来闪存手头上进行到一半的工作。
git stash
然后创建一个专用于修改bug的分支,假设我们这个bug是在master版本上
首先切换到master分支
git checkout master
创建并切换到fix-bug-01分支
git checkout -b fix-bug-01
然后修复bug,提交,再merge到master。
接下来,想要回到stash之前的工作,运行以下命令查看所有stash点
git stash list
调出最新的stash点,并删除
git stash pop
如果存在多个stash点,可以选择调出哪一点
git stash apply stash@{1}
@{1} 即git stash list中显示的stash点id
注意: git stash apply命令只会调出stash点,不会删除该stash点。
可以使用 git stash drop删除指定stash点。
4.9 删除未合并过的分支
git branch -D <branch-name>
5. 多人协作工作模式
多人协作的工作模式通常是这样:
首先,可以试图用git push origin branch-name推送自己的修改;
如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并;
如果合并有冲突,则解决冲突,并在本地提交;
没有冲突或者解决掉冲突后,再用git push origin branch-name推送就能成功!
如果git pull提示“no tracking information”,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream branch-name origin/branch-name。
6. 标签管理
6.1 创建标签
首先切换到想要打标签的分支
git tag -a <tag-name> -m <comment> <commit id>
6.2 查看标签
查看所有标签
git tag
查看某个标签详细信息
git show <tag-name>
6.3 删除标签
git tag -d <tag-name>
6.4 推送某个标签到远程
git push origin <tag-name>
一次性推送全部尚未推送到远程的本地标签
git push origin --tags
6.5 删远程标签
git push origin :refs/tags/<tag-name>
7. 忽略文件
工作区中有些文件我们不希望交由git管理,比如数据库连接配置文件、存放了口令的文件等。这时可以通过.gitignore进行管理。
我们不必自己来从头开始写.gitignore文件,所有配置文件可以直接在线浏览:https://github.com/github/gitignore
一个.gitignore文件示例
# Windows:
Thumbs.db
ehthumbs.db
Desktop.ini
# My configurations:
db.ini
deploy_key_rsa
最后我们需要把.gitignore也提交到Git,才能生效。