Git分布式版本控制系统

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


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中删除,恢复工作现场。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值