Git使用教程

Git使用教程

安装Git

git下载地址

访问上述链接安装完成后进行相关配置

Git使用前配置

查看配置
  • 可以通过下述命令查看所有的配置以及它们所在的文件

    bash 复制代码
    $ git config --list --show-origin
    
    # 以下为运行命令后的结果
    file:C:/software/Git/Git/etc/gitconfig  diff.astextplain.textconv=astextplain
    file:C:/software/Git/Git/etc/gitconfig  filter.lfs.clean=git-lfs clean -- %f
    file:C:/software/Git/Git/etc/gitconfig  filter.lfs.smudge=git-lfs smudge -- %f
    file:C:/software/Git/Git/etc/gitconfig  filter.lfs.process=git-lfs filter-process
    file:C:/software/Git/Git/etc/gitconfig  filter.lfs.required=true
    file:C:/software/Git/Git/etc/gitconfig  http.sslbackend=openssl
    file:C:/software/Git/Git/etc/gitconfig  http.sslcainfo=C:/software/Git/Git/mingw64/etc/ssl/certs/ca-bundle.crt
    file:C:/software/Git/Git/etc/gitconfig  core.autocrlf=true
    file:C:/software/Git/Git/etc/gitconfig  core.fscache=true
    file:C:/software/Git/Git/etc/gitconfig  core.symlinks=false
    file:C:/software/Git/Git/etc/gitconfig  pull.rebase=false
    file:C:/software/Git/Git/etc/gitconfig  credential.helper=manager
    file:C:/software/Git/Git/etc/gitconfig  credential.https://dev.azure.com.usehttppath=true
    file:C:/software/Git/Git/etc/gitconfig  init.defaultbranch=master
    file:C:/Users/29582/.gitconfig  credential.https://gitee.com.provider=generic
    file:C:/Users/29582/.gitconfig  user.email=xxxx@qq.com
    file:C:/Users/29582/.gitconfig  user.name=zx
  • 可以使用git config --list命令来列出所有 Git,当时可以找到的配置

    bash 复制代码
    $ git config --list
    
    # 以下为运行命令后的结果
    diff.astextplain.textconv=astextplain
    filter.lfs.clean=git-lfs clean -- %f
    filter.lfs.smudge=git-lfs smudge -- %f
    filter.lfs.process=git-lfs filter-process
    filter.lfs.required=true
    http.sslbackend=openssl
    http.sslcainfo=C:/software/Git/Git/mingw64/etc/ssl/certs/ca-bundle.crt
    core.autocrlf=true
    core.fscache=true
    core.symlinks=false
    pull.rebase=false
    credential.helper=manager
    credential.https://dev.azure.com.usehttppath=true
    init.defaultbranch=master
    credential.https://gitee.com.provider=generic
    user.email=xxxx@qq.com
    user.name=zx
  • 也可以通过输入git config <key>:来检查Git的某个配置

    bash 复制代码
    $ git config user.name
    zx
配置用户信息

安装Git之后,要做的第一件事就是设置你的用户名和邮件地址。这一点很重要,因为每一个Git提交都会用到这些信息,它们都会写入到你的每次提交中,不可更改:

bash 复制代码
git config --global user.name "zx"
git config --global user.email johndoe@example.com

Git基础命令

获取代码仓库

初始化本地仓库

先进入项目文件目录,然后运行下述命令

bash 复制代码
cd myproject
git init
从远程获取仓库
bash 复制代码
git clone https://github.com/libgit2/libgit2

管理代码

查看当前文件状态
bash 复制代码
git status
跟踪(暂存)新文件
bash 复制代码
git add test.txt # 跟踪一个文件
git add * # 跟踪所有文件
git add . # 跟踪所有文件
提交更新文件
bash 复制代码
git commit -m "init project" 
git commit -a -m 'change' # 使用该命令不需要git add 暂存,并且是把所有修改的文件提交
删除文件

要从 Git 中移除某个文件,就必须要从已跟踪文件清单中移除(确切地说,是从暂存区域移除),然后提交。 可以用 git rm 命令完成此项工作,并连带从工作目录中删除指定的文件,这样以后就不会出现在未跟踪文件清单中了。

如果只是简单地从工作目录中手工删除文件,运行 git status 时就会在 "Changes not staged for commit" 部分(也就是 未暂存清单)看到:

bash 复制代码
$ git status
On branch master
Changes not staged for commit:
  (use "git add/rm <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
        deleted:    test.txt

no changes added to commit (use "git add" and/or "git commit -a")

然后再运行 git rm 记录此次移除文件的操作:

bash 复制代码
$ git rm test.txt
rm 'test.txt'

$ git status
On branch master
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        deleted:    test.txt

下一次提交时,该文件就不再纳入版本管理了。 如果要删除之前修改过或已经放到暂存区的文件,则必须使用强制删除选项 -f(译注:即 force 的首字母)。 这是一种安全特性,用于防止误删尚未添加到快照的数据,这样的数据不能被 Git 恢复。

bash 复制代码
git rm -f text.txt

另外一种情况是,我们想把文件从 Git 仓库中删除(亦即从暂存区域移除),但仍然希望保留在当前工作目录中。 换句话说,你想让文件保留在磁盘,但是并不想让 Git 继续跟踪。 当你忘记添加 .gitignore 文件,不小心把一个很大的日志文件或一堆 .a 这样的编译生成文件添加到暂存区时,这一做法尤其有用。 为达到这一目的,使用 --cached 选项:

bash 复制代码
git rm --cached text.txt

git rm 命令后面可以列出文件或者目录的名字,也可以使用 glob 模式。比如:

bash 复制代码
git rm log/\*.log

注意到星号 * 之前的反斜杠 \, 因为 Git 有它自己的文件模式扩展匹配方式,所以我们不用 shell 来帮忙展开。 此命令删除 log/ 目录下扩展名为 .log 的所有文件。 类似的比如:

bash 复制代码
git rm \*~

该命令会删除所有名字以 ~ 结尾的文件。

移动文件

不像其它的 VCS 系统,Git 并不显式跟踪文件移动操作。 如果在 Git 中重命名了某个文件,仓库中存储的元数据并不会体现出这是一次改名操作。 不过 Git 非常聪明,它会推断出究竟发生了什么。

既然如此,当你看到 Git 的 mv 命令时一定会困惑不已。 要在 Git 中对文件改名,可以这么做:

bash 复制代码
 git mv test.txt text1.txt

它会恰如预期般正常工作。 实际上,即便此时查看状态信息,也会明白无误地看到关于重命名操作的说明:

bash 复制代码
$ git status
On branch master
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        renamed:    test.txt -> text1.txt

其实,运行 git mv 就相当于运行了下面三条命令:

bash 复制代码
$ mv README.md README
$ git rm README.md
$ git add README

查看提交历史

当你在此项目中运行 git log 命令时,可以看到下面的输出:

bash 复制代码
$ git log
commit ca82a6dff817ec66f44342007202690a93763949 (HEAD -> master, origin/master, origin/HEAD)
Author: Scott Chacon <schacon@gmail.com>
Date:   Mon Mar 17 21:52:11 2008 -0700

    changed the verison number

commit 085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7
Author: Scott Chacon <schacon@gmail.com>
Date:   Sat Mar 15 16:40:33 2008 -0700

    removed unnecessary test code

commit a11bef06a3f659402fe7563abf99ad00de2209e6
Author: Scott Chacon <schacon@gmail.com>
Date:   Sat Mar 15 10:31:28 2008 -0700

    first commit

撤消操作

修改commit信息

在任何一个阶段,你都有可能想要撤消某些操作。 这里,我们将会学习几个撤消你所做修改的基本工具。 注意,有些撤消操作是不可逆的。 这是在使用 Git 的过程中,会因为操作失误而导致之前的工作丢失的少有的几个地方之一。

有时候我们提交完了才发现漏掉了几个文件没有添加,或者提交信息写错了。 此时,可以运行带有 --amend 选项的提交命令来重新提交:

bash 复制代码
git commit --amend # 该命令会启动文本编辑器,文本编辑器启动后,可以看到之前的提交信息。 编辑后保存会覆盖原来的提交信息。

这个命令会将暂存区中的文件提交。 如果自上次提交以来你还未做任何修改(例如,在上次提交后马上执行了此命令), 那么快照会保持不变,而你所修改的只是提交信息。

取消暂存的文件

如果,你已经修改了两个文件并且想要将它们作为两次独立的修改提交, 但是却意外地输入 git add * 暂存了它们两个。如何只取消暂存两个中的一个呢? git status 命令提示了你:

bash 复制代码
$ git add *
$ git status
On branch master
Your branch is ahead of 'origin/master' by 1 commit.
  (use "git push" to publish your local commits)

Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        modified:   README
        modified:   Rakefile

在 "Changes to be committed" 文字正下方,提示使用 git restore --staged <file>... 来取消暂存。 所以,我们可以这样来取消暂存 README 文件:

bash 复制代码
git restore # 丢弃工作区的修改(不包括对文件自身的操作,如添加文件、删除文件)
git restore --staged README # 将暂存区的修改重新放回工作区(包括对文件自身的操作,如添加文件、删除文件) 
git restore --staged * # 取消所有暂存文件
版本回退(撤销commit)
  • 先查询对应的提交历史,使用如下命令

    bash 复制代码
    $ git log --pretty=oneline
    
    cd78655bf26c5c45c18e2a12bb7fc41c3a268027 (HEAD -> master) merge
    ffea5b3477185a79f85defd27dce18afbf933d66 mmmm
    6c461ca1810b6bcda11bdc355660108a5a45e7d4 (testing) testing
    31974debf8038d08846a4f15f7155c4ce1854ff3 change
    132cf27d681a823ad33d17733fe4a2f8aa828bff change
    ca82a6dff817ec66f44342007202690a93763949 (origin/master, origin/HEAD) changed the verison number
    085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7 removed unnecessary test code
    a11bef06a3f659402fe7563abf99ad00de2209e6 first commit
  • 版本回退,使用如下命令

bash 复制代码
git reset --soft commitID # 只删除commitID之后的提交记录log,代码的改动还在。
git reset --hard commitID # 彻底删除commitID之后所做的改动,代码也一起回退回来了。(慎重用,用前最好备份一下代码,或者用git diff 生成一个patch)

远程仓库

查看远程仓库

如果想查看你已经配置的远程仓库服务器,可以运行 git remote 命令。 它会列出你指定的每一个远程服务器的简写。 如果你已经克隆了自己的仓库,那么至少应该能看到 origin ------这是 Git 给你克隆的仓库服务器的默认名字:

你也可以指定选项 -v,会显示需要读写远程仓库使用的 Git 保存的简写与其对应的 URL。

bash 复制代码
$ git remote
origin
$ git remote -v
origin  https://gitee.com/sunxiaochao/simplegit-progit.git (fetch)
origin  https://gitee.com/sunxiaochao/simplegit-progit.git (push)

添加远程仓库

运行 git remote add <shortname> <url> 添加一个新的远程 Git 仓库,同时指定一个方便使用的简写:

bash 复制代码
$ git remote add pb https://github.com/paulboone/ticgit
$ git remote -v
origin  https://gitee.com/sunxiaochao/simplegit-progit.git (fetch)
origin  https://gitee.com/sunxiaochao/simplegit-progit.git (push)
pb      https://github.com/paulboone/ticgit (fetch)
pb      https://github.com/paulboone/ticgit (push)

从远程仓库中抓取与拉取

从远程仓库中获得数据,可以执行git fetch <remote>

bash 复制代码
git fetch pb

这个命令会访问远程仓库,从中拉取所有你还没有的数据。 执行完成后,你将会拥有那个远程仓库中所有分支的引用,可以随时合并或查看。

如果你使用 clone 命令克隆了一个仓库,命令会自动将其添加为远程仓库并默认以 "origin" 为简写。 所以,git fetch origin 会抓取克隆(或上一次抓取)后新推送的所有工作。 必须注意 git fetch 命令只会将数据下载到你的本地仓库------它并不会自动合并或修改你当前的工作。 当准备好时你必须手动将其合并入你的工作。

果你的当前分支设置了跟踪远程分支, 那么可以用 git pull 命令来自动抓取后合并该远程分支到当前分支。 这或许是个更加简单舒服的工作流程。默认情况下,git clone 命令会自动设置本地 master 分支跟踪克隆的远程仓库的 master 分支(或其它名字的默认分支)。 运行 git pull 通常会从最初克隆的服务器上抓取数据并自动尝试合并到当前所在的分支。

推送到远程仓库

当你想分享你的项目时,必须将其推送到上游。 这个命令很简单:git push <remote> <branch>。 当你想要将 master 分支推送到 origin 服务器时(再次说明,克隆时通常会自动帮你设置好那两个名字), 那么运行这个命令就可以将你所做的备份到服务器:

bash 复制代码
git push origin master
git push -u origin master # 设置默认推送分支

远程仓库的重命名与移除

你可以运行 git remote rename 来修改一个远程仓库的简写名。 例如,想要将 pb 重命名为 paul,可以用 git remote rename 这样做:

bash 复制代码
$ git remote rename pb paul
$ git remote
origin
paul

如果因为一些原因想要移除一个远程仓库------你已经从服务器上搬走了或不再想使用某一个特定的镜像了, 又或者某一个贡献者不再贡献了------可以使用 git remote removegit remote rm

bash 复制代码
$ git remote remove paul
$ git remote
origin

Git 分支

分支基础操作

bash 复制代码
git branch testing # 创建testing分支
git branch # 查看本地分支
git branch -a # 查看本地及远程分支
git branch -v # 查看每一个分支的最后一次提交
git branch -vv # 查看本地分支对应的远程分支
git checkout testing # 切换分支
git checkout -b testing # 创建并切换到testing分支
git branch -d testing # 删除本地分支

远程分支

bash 复制代码
git checkout -b dev origin/dev # 将远程分支同步到本地
git checkout dev # 如果远程分支上有dev,那么创建分支dev后会自动同步远程分支到本地
删除远程分支
bash 复制代码
git push remote_name -d remote_branch_name
查看远程分支
bash 复制代码
git branch -r
查看远程分支和本地分支
bash 复制代码
git branch -a
切换到远程分支
git checkout -b dev origin/dev

远程分支与本地分支绑定

远程分支与本地分支没有建立联系时,可以用如下命令绑定

bash 复制代码
git branch --set-upstream-to=origin/master master

合并分支

当我们在testing分支中完成开发工后,需要将master分支和testing分支合并,可以使用git merge命令:

bash 复制代码
git chaekout master # 先切换到master分支
git merge testing # 再合并分支

遇到冲突时的分支整合

有时候合并操作不会这么顺利。如果你在两个不同的分支中,对同一个文件的同一个部分进行了不同的修改,Git 就无法干净的合并它们。

如在mastertesting分支都修改了README文件,并都提交了在合并分支就会出现冲突

bash 复制代码
$ git status
On branch master
Your branch is ahead of 'origin/master' by 3 commits.
  (use "git push" to publish your local commits)

You have unmerged paths.
  (fix conflicts and run "git commit")
  (use "git merge --abort" to abort the merge)

Unmerged paths:
  (use "git add <file>..." to mark resolution)
        both modified:   README

no changes added to commit (use "git add" and/or "git commit -a")

README文件如下所示

这表示HEAD所指示的版本(那么你的master分支所在的位置,因为你在运行合并命令的时候已经检出到了这个分支)在这个表示的上半部分(=======的上半部分),而isstesting53分支所指示的版本在=======的下半部分。为了解决冲突,你必须选择使用由=======分割的两个部分中的一个,或者你也可以自行合并这些内容。例如,你可以通过把be内容换成下面的样子来解决冲突:

变基

变基操作的实质是丢弃一些现有的提交,然后相应地新建一些内容一样但实际上不同的提交。 如果你已经将提交推送至某个仓库,而其他人也已经从该仓库拉取提交并进行了后续工作,此时,如果你用 git rebase 命令重新整理了提交并再次推送,你的同伴因此将不得不再次将他们手头的工作与你的提交进行整合,如果接下来你还要拉取并整合他们修改过的提交,事情就会变得一团糟。

相关推荐
小小工匠1 小时前
ElasticSearch - 深入解析 Elasticsearch Composite Aggregation 的分页与去重机制
elasticsearch·composite·after_key·桶聚合分页
风_流沙1 小时前
java 对ElasticSearch数据库操作封装工具类(对你是否适用嘞)
java·数据库·elasticsearch
szxinmai主板定制专家1 小时前
【国产NI替代】基于FPGA的32通道(24bits)高精度终端采集核心板卡
大数据·人工智能·fpga开发
TGB-Earnest3 小时前
【py脚本+logstash+es实现自动化检测工具】
大数据·elasticsearch·自动化
大圣数据星球5 小时前
Fluss 写入数据湖实战
大数据·设计模式·flink
suweijie7685 小时前
SpringCloudAlibaba | Sentinel从基础到进阶
java·大数据·sentinel
high201110 小时前
【Git】-- 版本说明
git
Data跳动10 小时前
Spark内存都消耗在哪里了?
大数据·分布式·spark
kaixin_learn_qt_ing10 小时前
git clone
git