JasonWang's Blog

Git常用命令

字数统计: 1.9k阅读时长: 7 min
2016/03/07

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

参考文献

原文作者:Jason Wang

更新日期:2022-06-24, 14:52:00

版权声明:本文采用知识共享署名-非商业性使用 4.0 国际许可协议进行许可

CATALOG
  1. 1. 更新Git版本
  2. 2. 配置Git
    1. 2.1. 添加用户名与邮箱
    2. 2.2. 配置编辑器
    3. 2.3. 确认当前配置
    4. 2.4. 保存当前用户验证信息
  3. 3. 获取Git代码仓库
    1. 3.1. 初始化代码仓库
  4. 4. 在仓库中记录文件修改
    1. 4.1. 查看文件状态
    2. 4.2. 跟踪新创建的文件
    3. 4.3. staging 已修改文件
    4. 4.4. 查看文件的详细修改
      1. 4.4.1. 执行修改
    5. 4.5. 移除文件
    6. 4.6. 重命名文件
    7. 4.7. 查看修改记录
    8. 4.8. 取消修改
    9. 4.9. revert修改
    10. 4.10. 取消所有合入修改
  5. 5. 远程操作
    1. 5.1. 查看远程Git服务器
    2. 5.2. 添加远程仓库
    3. 5.3. fetch/pull 操作
    4. 5.4. 将本地修改push到远程仓库
    5. 5.5. 获取远程仓库的状态
    6. 5.6. 重命名/移除远程代码仓库
  6. 6. 同步fork 分支
    1. 6.1. (0) 跟踪fork分之代码
    2. 6.2. (1) 从fork 的master 分支获取最新的修改
    3. 6.3. (2) 切换到本地 master 分支
    4. 6.4. (3) 将upstream/master 分支的修改合入 本地 master 分支
    5. 6.5. 查看所有远程分支状态
  7. 7. 如何新建一个Github项目?
    1. 7.1. 初始化 本地 repository
    2. 7.2. 跟踪(Track)本地文件到本地 repository
    3. 7.3. 提交修改到本地 repository
    4. 7.4. 添加远程repository
    5. 7.5. 将本地修改push到远程repository
  8. 8. 如何使用git生成/合入patch
    1. 8.1. 生成patch
    2. 8.2. 合入patch
  9. 9. 参考文献