提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
Git简介
Git是分布式版本控制系统,优于svn等集中式版本控制系统的是强大的分支管理,可对不同的feature建立不同的分支进行开发,而不会影响其他代码。
一、Git提交代码原理
工作区:代码开发区;
stage(暂存区):要提交的修改缓存区,使用 git status 进行查看
master:master分支,一般来说提交到自己本地分支的版本库,再由本地分支提交到远程分支。
当暂存区commit之后,stage中的文件清除,下次在工作区的修改是与当前分支(即上次commit)的内容进行对比,git diff 可看到本次的修改内容。
通常,开发人员在某个基点同步一套代码到本地,不断在此基础上建立本地分支进行代码开发,并选择分支提交到dev分支上,而dev分支随着不同的提交HEAD不断往前走,而对于某一个研发人员来说,不及时同步dev代码,或者与别人同时修改了一个文件,会出现conflict的情况而不能成功提交到dev分支上,而dev分支不时地将代码合入master分支。
当从远程仓库克隆时,Git自动把本地的master分支和远程的master分支对应起来,使用git remote查看远程库的信息;git remote -v 可显示更详细的信息,显示抓取推送的地址。
二、基本命令
1.git init
在一个目录下执行 git init
将此目录变成一个空仓库,生成一个.git 隐藏文件.
.git文件即是本目录的版本库,对于本仓库所有的操作都会记录在此目录下的文件中,不能轻易的改变此目录下的文件,否则会破环此仓库。
值得说明的是,Android根目录.repo/manifests/下的xml保存着各个仓库的信息,用于在使用repo sync 同步代码时,根据git仓库去同步每个仓库的代码,如果建立一个仓库后,未加入到xml文件中,别人也不会同步到你的仓库以及代码。
2.git diff
git diff --no-index [<options>] <path> <path>
用于比较本地修改和上次commit的差异,上次commit可通过 git log 查看。
+ 表示较上次增加的部分
- 表示较上次删除的部分
3.git add
git add <file>
在.git的统计目录中执行,将本目录下工作区的文件都添加到stage中,用于commit到分支。
git add . 将所有的修改都add进stage,可通过 git status 查看stage中的内容,只有放到stage中的内容才可以被commit, 所以,如果不需要commit的,可以不适用 git add 添加到stage中。
4.git commit
usage: git commit [<options>] [--] <pathspec>...
将stage中的内容提交到本地版本库,使用该命令之后,可通过 git log 查看提交信息,并且仓库下的.git目录中的文件也会发生相应的变化。
git commit -m "comment" : commit时添加message.
git commit -a : stage中的文件全部commit
git commit --amend :修改上次提交
5.git status
git status
用于查看stage的状态.
6.git log
usage: git log [<options>] [<revision-range>] [[--] <path>...]
查看本地版本库的commit信息,通过该命令可以看到 git commit 命令的提交,并且值得注意的是,执行该命令后,可以看到当前HEAD的指向和本地分支信息。
7.git show
usage: git show [<options>] <object>...
用于显示查看某次commit的详细信息
git show [commit-ID] 查看具体某一个commit的信息,若不指定commit-ID,则查看最后一次提交的信息。
8.git reset
git reset
用于版本前进或后退.
git reset --hard SHA-1 回到某个指定的commit
git reset --hard HEAD^ 往前回退一个或几个版本.
git reset --soft SHA-1 回到某个指定的commit,但保存之后的修改。
git reset --hard HEAD^ 往前回退一个或几个版本,但保存之后的修改。
其中,HEAD指向的版本就是当前版本,Git允许在版本的历史之间穿梭。
如果本地存在未commit的修改,直接执行 git reset 会出现unstaged等错误,如果确定不保存修改,可使用 git reset --hard 可强制回退。
9.git rebase
usage: git rebase [-i] [options] [--exec <cmd>] [--onto <newbase> | --keep-base] [<upstream> [<branch>]]
or: git rebase [-i] [options] [--exec <cmd>] [--onto <newbase>] --root [<branch>]
or: git rebase --continue | --abort | --skip | --edit-todo
主要作用是:变基
如果本地没有及时同步代码,在原来的HEAD做了一些提交,但未合入远程分支,需要使用 git rebase 来进行base的同步,也就是使本地所做的修改重新基于最新的分支代码,此操作会对本地的提交产生新的snapshot,如果已经别人和自己同时修改了一个文件,在使用 git rebase 的时候会出现conflict,需要使用 git status 查看哪些文件存在冲突,然后修改掉冲突的部分,通过 git add 添加就可以了。
git rebase 还有一个好的用法:git rebase -i [commit-ID]
适用场景:如果本地存在3笔提交,现在发现之前的提交有Bug, 修复bug后,按照常规的 git commit 操作,就会将bug修复的代码添加到最后一笔提交,使用 git rebase 就可以在之前的commit上进行修改,同时又会保留后面的commit。但在之前的commit修改了bug之后,后面的commit也就是变基了,snapshot也就发生了变化。
10.git pull
git pull
把最新的提交抓下来
11.git push
git push
将本地分支提交到远程仓库。
12.git cherry-pick
git cherry-pick
用于复制一个指定的提交到当前分支,
值得注意的是,由于拷贝提交的base和本地当前代码可能不一致所导致conflict,还需要解冲突处理,重新提交。
13.git branch
git branch 查看分支
git branch <name> 创建分支
git branch -d <name> 删除分支
14.git merge
git merge <branch_name>
用于将branch_name分支合并到当前分支.
通常使用Fast-forward进行合并,直接把当前分支的HEAD指向branch_name分支,合并速度非常快。
但是,如果master分支和feature1分支相较于远程分支各自都分别有新的提交时,在合并时会出现冲突,git status可以显示冲突的文件。
解决方法:
git branch <new branch>
git add <confilct file>
git commit
git merge --no-ff -m "comment" <branch_name>
将branch_name合并到当前分支,因为在merge时生成一个新的commit,可从分支历史得到分支信息。
15.git stash
用于在当前分支未完成工作,又不想提交,但是,又需要建立新的分支处理新的工作,此时执行 git stash 命令暂时将当前分支的工作save一下,相当于ctrl+s,并不会建立commit,stage的内容时空的,但工作内容不会丢失。等处理完了其他工作之后,切回此分支,再恢复工作现场,继续工作。
git stash: 保存工作内容
git stash list : 查看保存的工作内容
git stash pop : 从stash中取出保存的工作内容,并从stash中删除,恢复工作现场。