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 remove
或 git 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 就无法干净的合并它们。
如在master
和testing
分支都修改了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
命令重新整理了提交并再次推送,你的同伴因此将不得不再次将他们手头的工作与你的提交进行整合,如果接下来你还要拉取并整合他们修改过的提交,事情就会变得一团糟。