Skip to content

Latest commit

 

History

History
256 lines (133 loc) · 9.05 KB

gitlearn.md

File metadata and controls

256 lines (133 loc) · 9.05 KB

Commands

config

[Git - 初次运行 Git 前的配置](https://git-scm.com/book/zh/v2/起步-初次运行-Git-前的配置

在命令行中配置某些信息:

$ git config --global user.name "John Doe"
$ git config --global user.email [email protected]
$ git config --list [--show-origin]  
# 进入某个repo后,查看所有Git当时能找到的配置 --list可简写成-l,
# 查看配置信息的来源文件
$ git config <key> # 来检查 Git 的某一项配置

配置信息存放在三个文件:

系统级别:/etc/gitconfig 文件包含系统上每一个用户及他们仓库的通用配置。用--system选项

用户级别:~/.gitconfig 文件只针对当前用户,用--global选项(用的最多)

项目级别:当前git仓库下.git/config仅针对该仓库,用--local选项

初始化git仓库的方式

  • 进入项目目录,git init,  但是,在这个时候,仅仅是做了一个初始化的操作(创建了.git文件夹),你的项目里的文件还没有被跟踪。

  • git clone

    支持HTTPS:git clone https://github.com/user/repo.git

    支持SSH:git clone [email protected]:user/repo.git (有时候HTTPS不行,用SSH会很管用)

    支持Git协议:git clone git://example.com/user/repo.git

The .gitignore file

.gitignore 文件中指定不需要追踪的文件或文件夹(让他们对git不可见)

github.com/github/gitignore

status

git status (-s) 查看所有文件状态(-s显示简单的概述):包括工作区和暂存区的差异(没有执行git add的文件, 包括修改、新增、删除的文件), 暂存区未执行commit的文件:

总的来说工作目录下的每一个文件都不外乎这两种状态:已跟踪 或 未跟踪,已跟踪是已经纳入版本控制的文件。未跟踪的文件会提示:

Untracked files: (use "git add ..." to include in what will be committed)

已跟踪的文件状态有可能有几种情况:

  • 修改了但是没有加入index(暂存区):

    Changes not staged for commit:

      (use "git add ..." to update what will be committed)

      (use "git restore ..." to discard changes in working directory)

            modified:   hello.cpp

  • 删除了但是没有加入index:【修改和删除后add和restore是一致的】

    Changes not staged for commit:

      (use "git add/rm ..." to update what will be committed)

      (use "git restore ..." to discard changes in working directory)

            deleted:    file2.txt

  • 暂存区未执行commit的文件

    Changes to be committed:

      (use "git restore --staged ..." to unstage)

            modified:   hello.cpp

add命令

git add [file-name1] [file-name2] 将修改的文件从workspace(工作区)添加到index(索引/暂存区)

git add . 将工作区修改和新增的文件添加到暂存区,不包括删除的文件

git add -u update tracked files

git add -A add changes from all tracked and untracked files

git diff

git diff [filename] 指定具体的文件就只查看这个文件,否则查看所有文件差异

不带参数,显示工作区文件与暂存区中最近的一次文件快照的差异

git diff --staged带参数的,显示的是staged between last commit

例:某文件修改1次,git add暂存,又修改1次,git diff只能看修改2,git diff --staged只能看修改1

(个人感觉用git diff查看文件差异不太方便,在IDE中使用Git diff)

git restore撤销修改

场景1:丢弃工作区的修改:discard changes in working directory

git restore <file>... / git checkout -- <file>...

if 修改后还没有被放到暂存区,撤销修改就回到和版本库一模一样的状态;

if 已经添加到暂存区后,又作了修改,撤销修改就回到添加到暂存区后的状态。

总之,就是让这个文件回到最近一次git commitgit add时的状态。

场景2:撤销暂存 (unstage)

git restore --staged <file> / git reset HEAD <file>

删除文件

在工作区删除文件之后,删除也算作修改,用git status查看,显示:

Changes not staged for commit:

  (use "git add/rm ..." to update what will be committed)

  (use "git restore ..." to discard changes in working directory)

deleted:    file1.txt

要把删除文件的操作添加到暂存区,用git add/rm file是等效的,然后再通过git commit提交

重命名文件

 要在 Git 中对文件改名,可以这么做:git mv file_from file_to 相当于:

mv file_from file_to; git rm file_from; git add file_to

如果是在外部软件中对文件改了名,记得把后两条命令执行一下

commit命令

git commit -m [message] 将暂存区所有文件添加到本地仓库

git commit [file-name1] [file-name2] -m [message] 将暂存区指定文件添加到本地仓库

git commit -am [message] 将工作区内容直接添加到本地仓库

git commit --amend 快速将当前文件修改合并到最新的commit,不会产生新commit。

例如,你提交后发现忘记了暂存某些需要的修改,可以像下面这样操作:

$ git commit -m 'initial commit'
$ git add forgotten_file
$ git commit --amend

最终你只会有一个提交——第二次提交将代替第一次提交的结果。

log

git log 显示所有commit日志,即commit历史记录

git log --pretty=oneline 将每条日志单行显示

git log -n 显示最近的n条记录

reflog

git reflog 显示操作本地版本库的命令,包括commit和reset。在回退版本后,找不到commit id了可用此命令查看历史

版本回退

HEAD是指向当前所在分支最新提交的指针。

git reset --hard HEAD^git reset --hard HEAD^^回退到上一版本、上上一

git reset --hard <commit id> 回退或恢复到指定的commit

版本回退后后悔了,想要恢复,可借助git reflog查看引用历史

远程仓库

添加远程仓库(必须在一个有.git的项目目录下):

  •  git remote add <shortname> <url>, shortname是别名。例如git remote add pb https://github.com/paulboone/ticgit

  • 一个repo目录下,可以有多个远程仓库。你使用 clone命令克隆了一个仓库,命令会自动将其添加为远程仓库并默认以 “origin” 为简写。

  • git remote 显示所有的远程仓库简写(必须在一个有.git的项目目录下)

从远程仓库中抓取与拉取:

git fectch <remote_name> 抓取克隆(或上一次抓取)后新推送的所有工作。

推送到远程仓库:

git push <remote_name> <branch_name>. 例如git push origin master

查看一个远程仓库更多信息:

git remote show <remote_name>

远程仓库重名名与移除:

git remote rename pb pual

git remote remove paul 

标签

列出标签: git tag [-l "通配符"]

创建标签(默认是为最新的commit打标签):

  • 创建附注标签:git tag -a <label> -m <message>

  • 创建轻量级标签:git tag <label>

  • 区别:附注标签是存储在 Git 数据库中的一个完整对象, 它们是可以被校验的,其中包含打标签者的名字、电子邮件地址、日期时间, 此外还有一个标签信息,并且可以使用 GNU Privacy Guard (GPG)签名并验证。 通常会建议创建附注标签。

为历史commit打标签:git tag -a xxx -m xxx <commit id>

推送标签到远程仓库:git push origin v1.5 or git push origin --tags推送一个本地标签或推送全部未推送的本地标签

删除一个本地标签 git tag -d <tagname>

删除一个远程标签 git push origin :refs/tags/<tagname>可以删除一个远程标签。

分支

在进行提交操作时,Git 会保存一个提交对象(commit object)。该提交对象会包含一个指向暂存内容快照的指针、作者的姓名和邮箱、提交时输入的信息以及指向它的父对象的指针。 首次提交产生的提交对象没有父对象,普通提交操作产生的提交对象有一个父对象, 而由多个分支合并产生的提交对象有多个父对象

Git 的分支,其实本质上仅仅是指向提交对象的可变指针。 Git 的默认分支名字是 master.是在git init之后自动创建的,很多人懒得改这个名字。

HEAD是一个指针,指向当前所在的本地分支

创建分支:git branch <branch_name>

  • 仅仅 创建 一个新分支,并不会自动切换到新分支中去。

切换到一个已存在的分支:git checkout <branch_name>

  • 这样 HEAD 就指向新的分支了。此时如果修改文件、再提交,新分支会前移,而master分支不动

  • 如果此时再git checkout mater, 会做两件事:HEAD指向master分支,将工作目录恢复成 master 分支所指向的快照内容。分支切换会改变你工作目录中的文件!

创建新分支的同时切换过去: git checkout -b <newbranchname>

  • 一条命令搞定创建+切换分支