Git

参考 http://chengshiwen.com/article/head-first-git/

文件状态

  • Git目录: (git directory),亦即Git仓库,一般对应项目根目录下的.git目录。该目录非常重要,每次克隆镜像仓库的时候,实际拷贝的就是这个目录里面的数据。

  • 工作目录:(working directory)是项目某个版本的签出(The working directory is a single checkout of one version of the project) ,也就是本地项目目录,其包含该版本的所有文件(不包括Git目录)。这些文件都是从Git目录中取出的,我们可以在工作目录中修改它们(modify)、删除它们(remove)或添加新文件(add)——这些称之为改动(Changes)。

  • 暂存区域:(staging area)是工作目录和Git目录之间的临时中转区,存储着工作目录中部分改动文件的快照,该快照将在下次提交时被永久地保存到Git目录中。暂存区域也叫索引(index),实际是Git目录下的index文件(.git/index),其存放了与当前暂存内容相关的信息,包括暂存的文件名、文件内容的SHA-1哈希值和文件访问权限,使用git ls-files --stage命令可查看其内容。

初始化

查看配置信息

git config --list

git config [--system/--global/--local] user.name

初始化新仓库

git init

从现有仓库克隆

从现有的项目仓库(如远程服务器上自己的项目,或者其它某个开源项目)克隆到本地,Git接收的是项目历史的所有数据(包括每一个文件的每一个版本)。

git clone <repo> [<dir>]

克隆时可以在上面的命令末尾指定新的名字,来定义要新建的项目目录名称(仅目录名称不同),例如:

git clone git@github.com:jquery/jquery.git myjquery

Git支持git://http(s)://ssh://等多种数据传输协议。

Git的基本工作流程

  • 改动文件:在工作目录中修改、删除或添加某些文件

  • 暂存文件:对改动后的文件进行快照,保存至暂存区域

  • 提交快照:将保存在暂存区域的文件快照永久转储到Git目录中

查看工作目录下当前文件的状态

git status

暂存文件

其作用是把目标文件快照放入暂存区域(add file into staged area)。

命令 新文件 被修改文件 被删除文件
git add Y Y N
git add -u N Y Y
git add -A Y Y Y

取消已修改或已暂存文件

git checkout [<commit>] [--] <file>...

  • 省略commit: 暂存区域 覆盖工作目录 的文件

  • 指定commit: 指定commit 覆盖暂存区域和工作目录

两者不会改变HEAD指针,其中--用于分隔指定文件,防止该文件与分支重名造成分支误操作。

$ git checkout -- grep.py   # 放弃grep.py文件未暂存的改动
$ git checkout . # 放弃所有未暂存的改动
$ git checkout HEAD *.txt # 放弃本次所有txt文件作的改动(包括工作目录和暂存区域)
$ git checkout HEAD . # 放弃所有已暂存改动和未暂存改动,即完全重置到最近的提交状态

文件重置为最近提交时的状态

git reset HEAD <file>

从暂存区域移除文件

git rm --cached <file>

差异比较

命令 描述
git diff 工作目录 / 暂存区域快照
git diff [--] <path>... 工作目录 / 暂存区域快照(指定文件或目录)
git diff --cached 暂存区域快照 / 上次提交
git diff --cached [--] <path>... 暂存区域快照 / 上次提交(指定文件或目录)
git diff HEAD 工作目录 / 上次提交
git diff <commit> 工作目录 / commit
git diff <commit> [--] <path>... 工作目录 / commit(指定文件或目录)
git diff --cached HEAD 暂存区域快照 / 上次提交
git diff --cached <commit> 暂存区域快照 / commit
git diff --cached <commit> [--] <path>... 暂存区域快照 / commit(指定文件或目录)
git diff <commit1> <commit2> commit1 / commit2
git diff --check 列出所有的尾随空白符

提交快照

把暂存区域内的文件快照提交至Git目录中:

git commit -m "Fix Bug #182: Fix benchmarks for speed"

把所有已经跟踪过的文件暂存起来一并提交:

git commit -a -m "added new benchmarks"

以新作者提交:git commit --author wjhook<wjhook@gmail.com>

将指定文件和已暂存文件一并提交:git commit -i <file>...

只提交指定文件:git commit -o <file>...

修改最后一次提交:

  • 重新编辑提交说明: git commit --amend -m <message>
  • 重新编辑提交作者: git commit --amend --author wjhook<wjhook@gmail.com>

Git的基本工作扩展

查看提交历史

git log --pretty=format:"%h [%an]<%ae>(%ad) message -> %s" --after="2016-08-12 15:26:00" --before="2016-08-25" --graph --author= wangjie -p -- *android/alibaba/member*FragmentMemberSignIn.java -3

按照"hash [作者]<邮箱>(时间) message -> 提交说明"的格式查看提交时间在2016-08-12 15:26:00 ~ 2016-08-25 之间的、作者为wangjie的关于*android/alibaba/member*FragmentMemberSignIn.java文件的log并显示提交差异。

%H	:提交对象(commit)的完整哈希字串
%h :提交对象的简短哈希字串
%an:作者(author)的名字
%ae:作者的电子邮件地址
%ad:作者修订日期(可以用 -date= 选项定制格式)
%ar:作者修订日期,按多久以前的方式显示
%s:提交说明

git log --diff-filter=[A/D] --summary

列出版本库中曾添加/删除过文件的提交

git log --diff-filter=[A/D] --summary | grep create

列出所有添加/删除过的历史文件

git log branch1..branch2:属于branch2,不属于branch1的提交

暂存栈

-> stash@{0/1/2/3...}

git stash [save <message>]: 当前工作保存到暂存栈中

git stash pop [<stash>]: 恢复暂存栈中引用为的工作,并从暂存栈中删除

git stash apply [<stash>]: 恢复暂存栈中引用为的工作,暂存栈中不删除

git stash drop [<stash>]: 删除暂存栈中引用为的工作

git stash list: 列出暂存栈中的所有工作

git stash show [<stash>]: 显示暂存栈中引用为的工作的改动记录

git stash clear: 清除暂存栈中所有保留的工作

git stash branch <branchname> [<stash>]: 基于指定工作创建新分支,完全恢复该工作被保存前的状态(新建一个最新提交为创建时所在的提交、名为的分支,同时切换到该分支,恢复暂存栈中引用为的工作,并将其从暂存栈中删除)

删除文件

rm <file>...:从工作目录中删除指定文件,但不从暂存区域移除

git rm <file>...:从工作目录中删除指定文件,同时将其从暂存区域移除

git rm --cached <file>...:仅仅将文件从暂存区域中移除(其状态变为未跟踪),不对该文件进行其它操作

git rm -f <file>...:强制删除

git rm -r <file>...:递归删除(用于删除目录)

移动或重命名文件

git mv <file_from> <file_to>

其等价于

$ mv <file_from> <file_to>
$ git rm <file_from>
$ git add <file_to
清除未跟踪文件

git clean -n: 显示将要清除的文件和目录

git clean -f:强制清除文件(不包括目录)

git clean -df:强制清除所有文件和目录

若要同时再移除被忽略的文件或目录,加上-x参数;若只移除被忽略的文件或目录,加上-X参数。

合并

git merge -m <msg> <commit>:如果产生新的合并提交,则附加msg说明

git merge --no-commit <commit>:合并成功后不会自动产生新的提交,用户可以在下次提交前对这次的合并结果进行修改和调整

git merge --abort:遇到合并冲突时,此命令将终止合并,并恢复未合并之前的状态

分支挑捡

如果不需要合并某个分支的全部提交,而只需要该分支的某个或某些提交,使用git cherry-pick命令,它会将指定的commit重新应用到当前分支,命令格式为:

$ git cherry-pick <commit>...

远程交互

查看远程仓库

git remote

加上-v选项,显示对应的克隆地址:git remote -v

添加远程仓库

git remote add <shortname> <url>

git remote add upstream https://github.com/xgenvn/InputHelper.git

拉取所有xgenvn有的,但本地仓库没有的信息

git fetch upstream

git remote rename <old> <new>:重命名远程仓库

git remote rm <name>:删除名为name的远程仓库

git remote [-v] show <name>:查看远程仓库信息

git remote prune <name>:删除不存在对应远程分支的本地分支

推送提交到远程仓库

git push <remote> <branch>

git push <remote> <lbranch>:[<rbranch>]:将本地lbranch分支推送到remote远程仓库的rbranch分支。若rbranch缺省则默认为lbranch,等同于git push

git push <remote> :<branch>:将空推送到remote远程仓库的branch分支,即删除remote远程仓库的branch分支

git push <remote> --delete <branch>:删除remote远程仓库的branch分支

git push <remote> -f <lbranch>:[<rbranch>]:将本地lbranch分支强制推送到remote远程仓库的rbranch分支

从远程仓库拉取最新改动

基本命令为git fetch,其作用是到远程仓库中拉取所有本地仓库中还没有的最新改动,但不会自动将这些改动合并到当前工作分支

git fetch [<remote>]:到remote远程仓库拉取所有本地仓库中还没有的最新改动,不指定remote则默认为origin

git fetch <remote> <branch>:将remote远程仓库的branch分支拉取到本地,同时用FETCH_HEAD指针指向它

git fetch --all:拉取所有远程仓库

git fetch -p:删除不存在对应远程分支的本地分支

从远程仓库拉取最新改动并合并

基本命令为git pull,其作用是从远程仓库自动拉取最新改动到本地(Fetch),然后将远程分支自动合并到本地仓库中的当前分支(Merge)

git pull <remote> <branch>

其将remote远程仓库的branch分支拉取到本地,然后将其合并到本地当前分支。

git pull <remote> <rbranch>:<lbranch>:将remote远程仓库的rbranch分支拉取到本地,然后将其合并到本地lbranch分支

重置

基本命令为git reset,其作用是将当前分支指针(HEAD指针)重置为指定状态

git reset [<commit>] [--] <paths>...

将暂存区域中指定路径的文件重置为指定commit(不指定则默认为HEAD)时的状态,但不会改变工作目录及当前分支,其相当于git add 的反向操作。该命令执行后,自从commit以来指定文件的所有改动都显示在Changes not staged for commit中,而这些改动的反向改动会显示在Changes to be committed中。

git reset (--soft|--mixed|--hard) [<commit>]

Git Note的更多相关文章

  1. Git Note - Branch

    1. add a new branch cd workspace git branch user1/newbranch1 git checkout user1/newbranch1 or git ch ...

  2. Git Note - git tag

    git tag is used to create labels, usually for version numbers. Format: git tag <TagName> <r ...

  3. Git - Tutorial [Lars Vogel]

    From: http://www.vogella.com/tutorials/Git/article.html Git - Tutorial Lars Vogel Version 5.6 Copyri ...

  4. Git工作流指南:Gitflow工作流 Comparing Workflows

    Comparing Workflows The array of possible workflows can make it hard to know where to begin when imp ...

  5. git使用ssh协议,生成公钥和私钥,并指定私钥

    http://superuser.com/questions/232373/how-to-tell-git-which-private-key-to-use In ~/.ssh/config, add ...

  6. git workflows

    https://www.atlassian.com/git/tutorials/comparing-workflows Comparing Workflows The array of possibl ...

  7. how to install git 1.8 rpm

    git版本在低于1.8之前,对于私有项目会出现401的pull失败错误,只能通过升级git版本来解决 It appears that git18 is no longer available from ...

  8. linux git升级到1.8.3

    1. Download PUIAS repo: wget -O /etc/yum.repos.d/PUIAS_6_computational.repo https://gitlab.com/gitla ...

  9. How To Use Git Source Control with Xcode in iOS 6

    This tutorial is by Malek Trabelsi, a passionate iOS developer from Tunisia focused primarily on mob ...

随机推荐

  1. 用Jetty 9.1运行Java WebSockets微服务

    Jetty 9.1的发布将Java WebSockets (JSR-356) 带入了非Java EE环境,从而开启了微服务时代.我们可以将Jetty的容器包含在java应用程序中(注意,不是Java代 ...

  2. redis 中 set 和 hset 有什么不同,什么时候使用 hset 什么时候使用set?

    转载:https://blog.csdn.net/wab719591157/article/details/73379844 redis 中存数据时,到底什么时候用  hset 相比于 set 存数据 ...

  3. android中使用spinner组件

    spinner组件类似于html中的select标签,实现下拉选择框的功能. 添加一个Activity,界面上添加一个spinner下拉框,一个button按钮.点击按钮,获取spinner下拉框当前 ...

  4. WinForm 之 应用程序开机自启动设置方法

    一.原理 需要开机自启动的程序,需要将其启动程序的路径写到注册表中指定的文件夹下. 二.实现方式 方法1:在生成安装程序时配置: 方法2:在程序运行时动态配置. 三.在生成安装程序时配置 1.右击安装 ...

  5. LoadRunner基于HTML-based script和URL-based script方式录制的区别和各自的使用场景

    一.区别: 为了更加直观的区别这两种录制方式,我们可以分别使用这两种方式录制同一场景(打开百度首页)然后进行对比,录制的代码如下: HTML-based script方式打开百度首页: Action( ...

  6. 动态加载jar包(一)

    一.编写被调用的类 package com.qunar.helloworld; public class HelloWorld { public String sayHello(){ return ( ...

  7. Linux安装nginx并设置https(openssl

    一.安装依赖包 1.$sudo apt-get install openssl    或者$sudo apt-get install libssl-dev 2.$sudo apt-get instal ...

  8. openerp 7.0邮件多用户发送失败问题 解决方法

    方法一(推荐): 修改代码/usr/lib/pymodules/python2.7/openerp/addons/base/ir/ir_mail_server.py #425 line: #mail_ ...

  9. excel 上标和下标

    开始--字体--设置单元格格式--上标/下标

  10. python之函数用法startswith()

    # -*- coding: utf-8 -*- #python 27 #xiaodeng #python之函数用法startswith() #http://www.runoob.com/python/ ...