git基础

git基础

git是什么

git是一个分布式版本控制系统,我们熟悉的svn是一个集中式的版本控制系统。分布式意味着每一台运行git的电脑既可以是客户端,也是“服务器”,客户端存储的数据与服务器存储的数据没有什么差别(同步后)。git与svn使用方法比较类似,但差别很大。其中一个比较大的差别是:svn等集中式版本控制系统一般是基于某个版本存储变化的数据,而git是存储各个时间点的完整镜像,如果某个文件没有变化,则只存储一个链接。分布式的一个明显的好处是,如果服务器崩溃了,我们可以从任意一台clone过它的客户端电脑进行恢复(可能会丢失一些服务端的hooks,但所有的版本控制数据都在)。

初始化一个仓库

$ git init
$ git add *.c
$ git commit -m 'initial project version'

git init会在当前目录创建一个.git子目录,用于存放版本控制信息。此时还没有对任何文件进行版本控制。
git add .c会把当前目录下的所有.c文件添加到提交列表,称之为stage files
开发过程中,我们更多的是clone一个仓库。

克隆一个仓库

$git clone https://github.com/libgit2/libgit2
$ git clone https://github.com/libgit2/libgit2 mylibgit2

类似于svn 的check out,git clone会克隆服务器当前时间点的所有数据。
想要clone到指定目录,可以在后面添加(上面例子中的第二条命令)。

检查文件状态

$ git status

可以查看新增了哪些文件?哪些文件变更了?哪些文件被删除了?
这里写图片描述
如上图所示:README是更改过的文件,deletedFile.txt是被删除的文件,newFile.txt是新增的文件。
git status的输出看起来比较繁杂,有没有简化的方式?答案是‘有’, 加-s参数:

$ git status -s

这里写图片描述
没有stage的文件notAdd.txt被标识为”??”。新增文件有一个’A’,更新的文件被标识为’M’。上面输出的每一行的前面部分其实有两个列,第一列指明文件被staged,第二列指明文件被更新了。例如在下面的输出中:README文件被更新了并且被staged了,然后又被更新了。deletedFile.txt被删除并且被staged了。
这里写图片描述

stage文件(加入提交列表)

只有stage的文件才会进入提交列表,用git add 命令stage要提交的文件,变更的文件、新增的文件在提交之前都需要使用git add添加到提交列表,否则不会提交

$ git add README
$ git add newFile.txt

执行上面两个命令之后,我们会看到更改的文件和新增的文件都被staged了(README和newFile.txt),下次执行git commit时,这两个文件将会被提交到git仓库。
这里写图片描述
删除的文件仍然处于unstaged状态,既没有进入提交列表。对于该文件的处理,命令行已经有提示,既:
git rm 删除该文件
git checkout 放弃变更(恢复该文件)

删除一个文件

$ git rm <file>

需要通过git rm 来显示通知git移除一个文件

stage所有的变更文件

我们可以使用一个命令stage所有的变更文件

$ git add --all

这样就不用当独对每个删除的、变更的、新增的文件单独执行git add命令

恢复文件(放弃变更)

$ git checkout <file>

只有处于unstaged状态的文件才能够被恢复。

unstage文件(从提交列表删除)

$ git reset HEAD <file>

不想提交某个文件时,可以使用这个命令。

文件状态生命周期

这里写图片描述
文件会有4种状态: Untracked, Unmodified, Modified, Staged。
新增文件处于Untracked状态,使用git add 命令添加文件后,文件状态转换为Staged状态。
Clone后或提交后(还未做任何文件更改),所有文件处于Unmodified状态。对文件进行编辑后,文件状态转换为Modified状态。
只有处于Staged的文件才会被提交。

过滤规则(设置忽略哪些文件)

通常,像.o,.tmp, *~这类文件,它们通常都是一些临时文件、编译生成的文件、日志文件等,我们希望git不要自动添加,甚至不要显示它们的untracked状态。我们可以创建.gitignore文件类设置过滤规则。
下面是一个简单的.gitignore文件例子:

$ cat .gitignore
*.[oa]
*~
*tmp

第一行告诉git忽略任何以”.a”和”.o”结尾的文件;第二行告诉git忽略任何以波浪符(~)结尾的文件;第三行告诉git忽略任何以”tmp”结尾的文件;
.gitignore编写规则如下:

  • 空行或以#开头的行被忽略
  • 支持标准的shell样式正则表达式
  • 以斜杠”/”结尾可以忽略目录
  • 以”!”开头可以对模式取反

GitHub为多个项目维护着一个相当全面的.gitignore文件列表,可以进行参考。

文件内容的具体变更

$ git diff
$ git diff --staged

第一个命令显示没有被staged的内容,第二个命令显示已经被staged的内容。

提交变更

要记住:任何仍然处于unstaged状态的东西 –– 任何你创建或更改了,但在你编辑之后没有对其执行git add的文件都不会被commit。

$ git commit -m "log message is here"
$ git commit -a -m "log message is here"

-a参数告诉git自动stage变更文件(更新的,删除的,但不包括新增文件),使你可以跳过git add部分。
不加-m会弹出一个文本编辑器,要求你编辑commit message。具体弹出什么编辑器跟你的配置有关。可用通过shell $EDITOR环境变量来指定用哪个编辑器,还可以通过git config –global core.editor进行设置。下面的例子设置gedit为默认编辑器:

$ declare -x EDITOR='gedit'
$ git git config --global  core.editor gedit

移动文件

$ git mv oldfile newfile

相当于如下命令:

$ mv oldfile newfile
$ git rm oldfile
$ git add newfile

查看提交历史

可直接使用

$ git log

不过现实的信息比较简略。下面是一些常用的参数:
-p 显示每个commit引入的差异。
–stat 显示每个commit的简略统计信息
另一个很有用的选项是–pretty,它可以改变log输出格式。当你想要产生日志用于机器分析时,这种方式很有用。例如:

$ git log --pretty=format:"%h - %an, %ar : %s"
9a471ae - uvsjoh, 7 hours ago : third commit
ac1e996 - uvsjoh, 8 hours ago : first commit

下面是一些常用的format选项:
%H Commit hash
%h Abbreviated commit hash
%T Tree hash
%t Abbreviated tree hash
%P Parent hashes
%p Abbreviated parent hashes
%an Author name
%ae Author e-mail
%ad Author date (format respects the –date=option)
%ar Author date, relative
%cn Committer name
%ce Committer email
%cd Committer date
%cr Committer date, relative
%s Subject

撤销操作

有的时候,你可能忘记添加文件,或想要完善commit message,想要再次提交。如果能再上次提交的基础上提交就再好不过了。使用下面的命令可以做到。

$ git commit --amend

这将会覆盖上一次的提交,即两次提交变成了一次。

切换开发分支

一个代码仓库里面可能会有多个分支,有一个是当前工作分支,提交时是默认提交到当前开发分支的。git branch可查看有哪些分支,其中标星号”*”的是当前工作分支。

$ git branch -v
  master  059a5c3 second commit
* testing 1afa3c0 third commit
git checkout <branch>可以切换分支
$ git checkout master
Switched to branch 'master'
master分支
Icon

每个Git仓库都会有一个master分支,它并不是一个特殊的分支,其实它就和其它分支一样。之所以每个仓库都会有,是因为git init命令默认创建了master分支,一般情况下很少有人会去改它。
分支模型是git的杀手锏,更多细节可以参考:Git Branching - Branches in a Nutshell

远程分支

查看远程仓库信息

$ git remote -v
origin  ssh://uvsjoh@gerritu.com.local:29418/u4/u4 (fetch)
origin  ssh://uvsjoh@gerritu.com.local:29418/u4/u4 (push)

查看远程仓库有哪些分支
$ git remote show origin
“origin”并不特殊
Icon
与master一样,origin并没有什么特殊的含义,”origin”是你运行git clone时,默认给远程仓库的一个命名。

从服务器同步代码

$ git fetch origin
$ git pull origin

git fetch不会自动merge到本地,origin自动merge到本地分支。git pull相当于git fetch 加上git merge。实际使用的过程中,使用git fetch会比较安全,可以先查看更新情况,再决定是否合并。

同步代码到服务器

命令:git push (remote) (branch)

$ git push origin u4playground/dev_webview_cache_m3_final

实际上git自动把分支名feature/dev_webview_cache扩展为refs/heads/feature/dev_webview_cache:refs/heads/feature/dev_webview_cache,意思是用我的本地feature/dev_webview_cache分支更新远程feature/dev_webview_cache分支。

查看远程分支

$ git branch -av
$ git branch -av | grep clear

删除本地分支

$ git branch -d feature/dev_clear_record
$ git branch -D feature/dev_clear_record

删除远程

$ git push origin --delete feature/dev_crash_restore
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值