Git

Git使用总结。

常用Git总结

Git config

git config配置的三个等级,优先级大小如下--system<--global<--local本地为最高优先级,系统配置为最低优先级,在文件中的位置分别是/etc/gitconfig~/.gitconfig,和自己项目中。

配置用户名:git config --global user.name "Jack"

配置邮箱:git config --global user.email "xuwenjiejack@gmail.com"

自定义Git输出颜色:git config --system color.ui auto

Note:如果你在localglobal中都设置了用户名和邮箱,而且是不同的,在你使用这个项目中使用的是local的配置

Git clone

Clone一个项目到本地(ssh/https):git clone [ssh/https]

在Github上默认会clone一个master分支到本地

Clone指定分支到本地:git clone -b [branch] [ssh/https]

Git init

初始化一个本地仓库:git init
初始化一个裸仓库:git init --bare xxx.git

Git status

查看本地文件的状态:git status

Note:会显示哪些文件添加,修改,删除。

Git add

添加所有状态改变的文件到暂存区等待提交:git add .

添加指定文件或者文件夹下所有状态改变的文件到暂存区:git add [<fileName/filePath>...]

Note:撤销添加到暂存区的文件或者文件夹git rm --cached [<fileName/filePath>...]

Git submodule add

添加一个子模块:

现在我需要将博客的原文件单独进行版本控制,但是又不能脱离博客(Github需要_posts目录底下的文件来进行生成网页),所以将Blog作为博客的子模块

  1. 添加一个子模块:Git submodule add https://github.com/XWJACK/Blog,会在目录底下生成一个.gitmodules文件,并会clone子模块。将Blog目录下的文件全部移动到_posts目录下。
  2. 修改生成的.gitmodules文件,修改目录位置:path = _posts
  3. 修改子模块配置:.git/modules/Blog/config,修改目录位置:worktree = ../../../_posts

Git commit

提交:git commit

提交简短的Information:git commit -m "Information"

添加所有修改的文件并提交:git commit -am "Information"

修改最后一次提交的Information:git commit --amend

Git diff

查看工作树和暂存区的差别:git diff

Note:如果git add .之后执行,结果会什么都不显示,因为工作树没有修改的部分。

查看暂存区和提交的差别:git diff HEAD

查看最近两次提交的差别:git diff HEAD~2

Git branch

显示当前所在分支:git branch

显示所有分支(包括远程分支):git branch -a

删除本地指定分支:git branch -d [branch]

删除一个远程分支:git push origin :[branch]或者git push origin --delete [branch]

Git checkout

快捷切换到上一个分支:git checkout -

Note:如果本地就两个分支,那么就可以快速切换,不用再写分支名。

切换指定分支:git checkout [branch]

从当前分支处新建一个分支:git checkout -b [branch]

获取远程指定分支:git checkout -b [branch] origin/[branch]

从本地指定的Tag创建一个分支:git checkout -b [branch] [tag]

获取远程tag:git fetch origin tag [tag]

Note:从远程的tag创建一个分支,需要先获取远程tag,然后再从本地tag创建一个分支。

Git remote

git remote -v: 显示远程信息

git remote add [name] [url]: 添加远程信息

git remote remove [name]: 删除远程信息

Example: git remote add origin https://github.com/XWJACK/Blog.git

Git tag

列出当前所有的Tag:git tag

新建一个Tag并写出详情:git tag -a [tag] -m "my version 1.0.0"

新建一个Tag:git tag [tag]

删除一个Tag:git tag -d [tag]

删除远程的一个Tag:git push origin tag —delete [tag]

Git push

push当前分支到远程:git push

push所有分支到远程:git push --all

Note:Git 2.x 的默认行为就是push当前分支到远程。这个也可以在config中配置 simple:push当前分支到远程,matching:push所有分支到远程

[push]

default = simple

default = matching

push当前分支到远程(在远程新建一个分支):git push origin [branch]git push origin [branch]:[branch] push local branch to remote branch

Note:一般我们在远程新建一个分支的时候会加上-u的参数,将origin的branch设置为本地仓库当前分支的上游(upstream)

所以我们新建分支应该这样:git push -u origin [branch]
新建分枝如果直接push会提示git push --set-upstream origin [branch],道理是一样的。

push一个Tag到远程分支:git push origin [tag]

一次性push所有的Tag到远程:git push origin --tags

Note:当远程主机的版本比本地版本新的时候,push会报错,这个时候我们采用:git push --force origin,一般我们在本地删除一个commit然后也想在远程主机上删除的时候就可以采用。

Git fetch

获得所有分支的更新:git fetch

获得所有分支的更新:git fetch origin

获取指定分支的更新:git fetch origin [branch]

Note:访问下载更新的分支,用origin/[branch]

一般我们git fetch一个分支之后查看没有问题,就会git merge origin/[branch]分支,将最新的更新信息归并到指定的分支。

Git merge

归并一个分支:git merge [branch]

明确显示从这个点开始归并一个分支:git merge --no-ff [branch]

Note:推荐使用--no-ff参数来明确表示这个点归并了其他分支。

Git pull

获取更新数据并合并到当前分支:git pull

Note:相当于git fetch origingit merge origin/[branch]

Git reset

回溯到指定版本(并将之后提交的修改返回到工作树区):git reset [hash]

回溯到指定版本:git reset --hard [hash]

Note:–hard是一个危险的操作,提交之后的东西都会消失。[hash]一般只要4位以上就可以。

git revert

回滚指定提交:git revert [hash]

Git log

查看提交日志:git log

以图表的形式显示:git log --graph

Note:git log只能显示到最后一次提交的信息。

如果我们使用git reset [hash]回溯到之前的版本,那么我们就看不到回溯点之后的信息。

这个时候我们应该使用git reflog来显示git操作的历史。

Git rebase

归并一个分支:git rebase [branch]

压缩两次提交历史:git rebase -i HEAD~3

Note:git rebase [branch]git merge [branch]的区别就是,git rebase [branch]在归并的时候会按提交的时间顺序归并。

当我们想将最近的两次commit压缩成一个commit:git rebase -i HEAD~3。这个时候会显示三次提交,只要将最后一个提交的的pick改成fixup就可以。

Git stash

储藏当前修改:git stash

列出所有储藏:git stash list

应用储藏:git stash apply

应用指定的储藏:git stash apply stash@{[index]}

Note:当我们在一个分支上进行修改了一部分内容之后,想切换分支,但是不想将完成一半的工作提交,这个时候我们采用git stash来储藏所有修改,再切换到其他分支上进行工作。

工作完成之后返回当前分支,想将之前完成一半的工作继续完成,采用git stash apply来应用最新的一次储藏或者git stash apply stash@{[index]}应用指定的储藏。

Advance

hooks

post-receive

1
2
3
4
5
6
7
#! /bin/sh
# 自动部署
# 直接使用git branch 会有其它分支,导致失败,所以从refs/heads中取分支
for branch in `ls refs/heads`;do
mkdir -p ./blob/$branch
git --work-tree=./blob/$branch --git-dir=./ checkout -f $branch
done

Git cherry-pick

当我们在A分支提交了几个commit,但是想将这几个提交点提交到B分支上。
1.一个commit:git cherry-pick <commit id>
2.一个commit保留原作者信息:git cherry-pick -x <commit id>
3.一个分支:git cherry-pick master

Git Convenience

自定义快捷命令:git config --system alias.xlog 'log --graph',这样我们以后直接使用git xlog

撤销修改:git checkout -- [<fileName/filePath>...]

Note:当我们修改一个文件之后(还没有git add),想放弃修改就可以撤销修改。

当我们修改文件并git add之后,想放弃修改并返回到为add的状态

git reset HEAD [<fileName/filePath>...]

显示最近两次提交的差别:git log -p -2

只显示一行:git log --pretty=oneline

按特定格式显示:git log --pretty=format:"%h %s" --graph

显示每一个分支的最后一次提交信息:git branch -v

最后发一下我的Git配置:

git config --system alias.xlog 'log --graph'

git config --system alias.xmerge 'merge --no-ff'

git config --system alias.xrebase3 'rebase -i HEAD~3'

git config --system alias.xcommit 'commit --amend'

git config --system alias。Rtag 'push origin tag --delete'

git config core.filemode false

Note: 不记录文件权限的改变

Github常用操作:

  1. 如何同步fork来的repository

Syncing a fork

git remote -v 显示所有的远程信息,找到源repository [name]

git fetch [name]/[branch]

git checkout master

git merge [name]/[branch]

Note: 最后一步也可以用 git merge --no-ff [name]/[branch] 来明确一个merge

如果想用命令行操作GitHub,建议使用 Hub