Git常用命令

Git是目前使用最普遍的开源分布式版本控制系统,由Linus Torvalds在2005年开发, 与传统的集中式代码管理工具SVN/CVS不同, git是一个分布式的版本控制工具, 如代码托管网站Github就是基于Git作版本管理; Android Studio也支持使用Git来进行版本控制。

这里就来看一看基本的Git命令操作。

更新Git版本

1
2
3

$ git clone git://git.kernel.org/pub/scm/git/git.git

配置Git

添加用户名与邮箱

1
2
3
4

$ git config --global user.name "John Doe"
$ git config --global user.email johndoe@example.com

配置编辑器

1
2
3

$ git config --global core.editor emacs

在Windows下,如果想使用Notepad++,则可以这么设置:

1
2
3

$ git config --global core.editor "'C:/Program Files/Notepad++/notepad++.exe' -multiInst -nosession"

对于64bit 系统,

1
2
3

$ git config --global core.editor "'C:/Program Files (x86)/Notepad++/notepad++.exe' -multiInst -nosession"

确认当前配置

1
2
3

$ git config --list

保存当前用户验证信息

在使用Git提交代码时,每次提交git都会要求输入 用户名和密码,很浪费时间。执行如下git命令,将用户名和密码保存到远端服务器,即可跳过该环节:

1
2
3
4

$ git config credential.helper store
$ git push http://example.com/repo.git

接着输入用户名跟密码后,执行修改提交都不用再验证了。

获取Git代码仓库

初始化代码仓库

在当前项目文件夹下,执行如下命令,会在该目录下创建一个子文件夹.git :

1
2

$ git init

如果想要将当前的代码进行版本控制,则需要跟踪这些文件并做一个初始化的执行操作:

1
2
3
4
5

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

这里把所有.c 文件以及LICENSE文件标记为跟踪(tracking)状态,然后进行commit操作,将其添加到Git的本地工作目录下。

获取已有的Git仓库

1
2
3

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

将仓库映射到mylibgit文件夹下:

1
2
3

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

在仓库中记录文件修改

在介绍具体的操作命令之前,先来看一看Git文件各个状态的生命周期。对于一个工作目录下的文件而言,主要有两种状态:untracked//tracked;tracked 文件在最近的一个Snapshot当中,它们可以是unmodified, modified,staged;而untracked 文件则是那些不在最近Snapshot和不在Staged area中的文件。当你第一次从克隆一个代码仓库时,所有文件都处于Tracked并且unmodified(未被修改)。

查看文件状态

1
2
3

$ git status

跟踪新创建的文件

1
2
3

$ git add README

staging 已修改文件

若某个文件已经处于Tracked,则执行add命令将其添加到Staging area

1
2
3

$ git add CONTRIBUTING.md

查看文件的详细修改

1
2
3

$ git diff

执行修改

最简单的命令是 git commit, 但是接着会弹出一个编辑器,需要输入该修改的简短描述,因此更为常用的是如下命令:

1
2
3

$ git commit -m "Story 182: Fix benchmarks for speed"

上述执行命令只是添加了处于Staging 状态的文件修改,那么要如何跳过staging,直接执行Tracked文件的修改?

1
2
3

$ git commit -a -m 'added new benchmarks'

移除文件

1
2
3

$ git rm PROJECTS.md

有时, 如果我们不希望某些文件或文件夹被跟踪, 可以通过.gitignore文件来直接忽略这些文件;而如果此前文件被修改了, 需要添加让.gitignore文件起作用, 则需要执行如下几个步骤:

1
2
3
4
5
6
7
8
9
10
11
12
13

#1. 首先将需要忽略的文件添加到.gitignore

#2. 将需要忽略的文件从cache中删除
git rm --cached <filename/directory>

#3. 更新git
git add <filename/directory>
git commit -m 'ignore filename/directory'




重命名文件

1
2
3

$ git mv file_from file_to

查看修改记录

1
2
3

$ git log

如果有时git status提示detached HEAD, 通过git branch -a会发现当前的分支处在detached HEAD状态,此时要如何处理?这种状态说明你本地的修改没有合入到主分支上,可以通过git reflog/git log -p找到本地修改的commit ID,然后切换到住分支后通过git cherry-pick <commit-id>将修改合入。

取消修改

Unstage 一个staged文件

1
2
3

$ git reset HEAD CONTRIBUTING.md

取消上一个修改:

1
2
3
4

git reset --soft HEAD^ // or
git reset --soft HEAD~1

如果需要取消某个commit的文件修改可以执行如下操作:

1
2
3

git show commit_sha1 -- some_file.c | git apply -R

revert修改

1
2
3

$ git checkout -- CONTRIBUTING.md

如要将某文件revert到指定的commit,可以执行如下操作:

1
2
3

git checkout <commit_id> -- <file>

取消所有合入修改

1
2
3

$ git reset --merge

远程操作

查看远程Git服务器

1
2
3

$ git remote

指定参数-v,可以查看Git服务的URL

1
2
3

$ git remote -v

添加远程仓库

指定一个短名字(以后使用该名字来操作远程仓库),可以获取相应的仓库: git remote add :

1
2
3

$ git remote add pb https://github.com/paulboone/ticgit

这样通过 fetch pb,便可以获得远程仓库的数据:

1
2
3

$ git fetch pb

fetch/pull 操作

通过指定远程仓库的名字,fetch操作用于获取远程仓库的数据:

1
2
3

$ git fetch origin

如果本地Git仓库已经设置成Track远程仓库,通过pull命令可以将远程的仓库的修改合入本地仓库:

1
2
3

$ git pull

将本地修改push到远程仓库

push用于将本地的数据修改合入到远程的仓库;在某一时刻,只允许一个用户执行该操作,若另一个用户也在执行该操作,则你的push会被
拒绝。这样,在进行一下此push操作时,你首先需要获取该用户的修改(fetch),然后执行push操作

git push [remote-name] [branch-name]

1
2
3

$ git push origin master

获取远程仓库的状态

如果想要获取某个远程仓库的具体信息,可以使用 git remote show [remote-name] ,

1
2
3

$ git remote show origin

重命名/移除远程代码仓库

1
2
3

$ git remote rename pb paul

这样远端的分支从 pb/master 更改为 paul/master. 如果想要移除某个仓库,使用 rm命令:

1
2
3

$ git remote rm paul

同步fork 分支

(0) 跟踪fork分之代码

1
2
3

$ git remote add upstream <remote-url>

(1) 从fork 的master 分支获取最新的修改

1
2
3

$ git fetch upstream

(2) 切换到本地 master 分支

1
2
3

$ git checkout master

(3) 将upstream/master 分支的修改合入 本地 master 分支

1
2
3

$ git merge upstream/master

查看所有远程分支状态

1
2
3

$ git branch -a

切换本地的工作分支->(提交代码对应的远程分支)

1
2
3

$ git checkout -b mybranch origin/remote-branch

如何新建一个Github项目?

在Git 新建一个 repository, 无需添加 README.md
在本地你的项目文件夹下,打开 git bash

初始化 本地 repository

1
2
3

$ git init

跟踪(Track)本地文件到本地 repository

1
2
3

$ git add .

提交修改到本地 repository

1
2
3

$ git commit -m "initial commit"

添加远程repository

1
2
3

$ git remote add origin https://github.com/your-name/your-repo.git

将本地修改push到远程repository

1
2
3

$ git push -u origin master

如何使用git生成/合入patch

在向外部代码仓库提交修改时可能需要手动生成patch,或者将他人的patch合入到自己的代码分支。这里来看下如何通过git来实现代码patch的修改与合入。

生成patch

1
2
git format-patch master --stdout > fix_empty_poster.patch

合入patch

在合入一个patch之前,可以通过git apply -v --check fix_empty_poster.patch 来检查某个patch是否可以正常合入:

1
2
3

git apply --stat fix_empty_poster.patch

参考文献