Git笔记
Git 工作流程
Git是分布式版本控制系统(Distributed Version Control System,简称 DVCS),分为两种类型的仓库:
本地仓库和远程仓库
工作流程如下
1.从远程仓库中克隆或拉取代码到本地仓库(clone/pull)
2.从本地进行代码修改
3.在提交前先将代码提交到暂存区
4.提交到本地仓库。本地仓库中保存修改的各个历史版本
5.修改完成后,需要和团队成员共享代码时,将代码push到远程仓库
一、Git的下载和安装
搜索Git官网,下载对应系统版本
1.1 Ubuntu系统下载
Ubuntu可通过
sudo apt-get install git-all//或apt-get install git
git --version //查看git版本号以确定是否安装成功
1.2 Windows系统下载
windows可通过在官网下载安装包进行安装,傻瓜式操作即可。
windows系统安装Git时会需要设置用户名和邮箱,这是用来每次对文件修改后合并推送等操作进行标记命名
1.3 设置用户名和邮箱
Linux系统可通过以下命令设置用户名和邮箱
git config user.name "Your Name"
git config user.email "youremail@yourdomain.com"
二、基本使用
2.1 创建仓库
git init
Git使用git init
命令来初始化一个Git仓库,执行git init
后会生成.git隐藏文件夹,该目录包含了资源的所有元数据,其他的项目目录保持不变。
使用方法:
在需要创建仓库的文件夹直接运行下方命令即可,在桌面运行即代表整个桌面文件创建一个仓库,所以不要在桌面执行这条命令。
git init #在命令行打开的目录下创建仓库
使用我们指定目录作为Git仓库:
运行下面的命令即代表在\home\gosel\Documet\Demo目录下创建仓库:
git init \home\gosel\Documet\Demo #在\home\gosel\Documet\Demo创建仓库
git clone
我们使用git clone
从现有 Git 仓库中拷贝项目
克隆仓库的命令格式为:
git clone <repo> #<repo>为远程仓库的地址
git clone git://github.com/schacon/grit.git #克隆Ruby语言的Git代码仓库Grit
如果我们需要克隆到指定的目录,可以使用以下命令格式:
git clone <repo> <directory> #<repo>为远程仓库地址 <directory>为本地目录
git clone git://github.com/schacon/grit.git mygrit #在mygrit路径克隆Ruby语言的Git代码仓库Grit
2.2 添加文件
touch RADEME.md #Linux系统可以使用touch命令创建文件
2.3 提交文件至本地仓库
git add 命令
添加一个或多个文件到暂存区:
git add [file1] [file2] ... #[file1]为文件名称
添加指定目录到暂存区,包括子目录:
git add [dir] #[dir]为目录地址
添加当前目录下的所有文件到暂存区:
git add . #添加当前目录下所有文件到暂存区
以下实例我们添加两个文件:
$ touch README # 创建文件
$ touch hello.php # 创建文件
$ ls
README hello.php
$ git status -s
?? README
?? hello.php
$
git commit 命令
git commit 命令将暂存区内容添加到本地仓库中。
提交暂存区到本地仓库中:
git commit -m [message] #message是修改的备注信息,方便日后识别,需要添加-m来添加备注信息
提交暂存区的指定文件到仓库区:
git commit [file1] [file2] ... -m [message]
-a 参数设置修改文件后不需要执行 git add 命令,直接来提交
$ git commit -a #相当于一条命令执行了git add .和git commit
$ git commit -am '' #相当于一条命令执行了git add .和git commit -m
接下来我们就可以对 hello.php 的所有改动从暂存区内容添加到本地仓库中。
以下实例,我们使用 -m 选项以在命令行中提供提交注释。
$ git add hello.php
$ git status -s
A README
A hello.php
$ git commit -m '第一次版本提交'
[master (root-commit) d32cf1f] 第一次版本提交
2 files changed, 4 insertions(+)
create mode 100644 README
create mode 100644 hello.php
2.4 修改文件,与再次提交
每次修改文件后都需要git add
和git commit
进行提交本地本舰到本地仓库,提交后下一次变动也需要这些操作进行提交记录。
2.5 查看文件状态
git status 命令用于查看项目当前的状态
$ git status
On branch master
Initial commit
Changes to be committed:
(use "git rm --cached <file>..." to unstage)
new file: README
new file: hello.php
通常我们使用 -s
参数来获得简短的输出结果:
$ git status -s
AM README
A hello.php
2.6 修改文件,不提交和上一个版本比较差异(diff)
git diff 命令比较文件的不同,即比较文件在暂存区和工作区的差异。
git diff 命令显示已写入暂存区和已经被修改但尚未写入暂存区文件的区别。
git diff 有两个主要的应用场景。
- 尚未缓存的改动:git diff
- 查看已缓存的改动: git diff --cached
- 查看已缓存的与未缓存的所有改动:git diff HEAD
- 显示摘要而非整个 diff:git diff --stat
显示暂存区和工作区的差异:
git diff [file]
显示暂存区和上一次提交(commit)的差异:
git diff --cached [file]
或
git diff --staged [file]
显示两次提交之间的差异:
git diff [first-branch]...[second-branch]
在 hello.php 文件中输入以下内容:
<?php
echo 'baidu:www.baidu.com';
?>
使用 git status 查看状态:
$ git status -s
A README
AM hello.php
$ git diff
diff --git a/hello.php b/hello.php
index e69de29..69b5711 100644
--- a/hello.php
+++ b/hello.php
@@ -0,0 +1,3 @@
+<?php
+echo 'baidu:www.baidu.com';
+?>
git status 显示你上次提交更新后的更改或者写入缓存的改动, 而 git diff 一行一行地显示这些改动具体是啥。
接下来我们来查看下 git diff --cached 的执行效果:
$ git add hello.php
$ git status -s
A README
A hello.php
$ git diff --cached
diff --git a/README b/README
new file mode 100644
index 0000000..8f87495
--- /dev/null
+++ b/README
@@ -0,0 +1 @@
+# Runoob Git 测试
diff --git a/hello.php b/hello.php
new file mode 100644
index 0000000..69b5711
--- /dev/null
+++ b/hello.php
@@ -0,0 +1,3 @@
+<?php
+echo 'baidu:www.baidu.com';
+?>
2.7 查看提交历史记录
Git 提交历史一般常用两个命令:
-
git log - 查看历史提交记录。
-
git blame
- 以列表形式查看指定文件的历史修改记录。 -
git log
-
在使用 Git 提交了若干更新之后,又或者克隆了某个项目,想回顾下提交历史,我们可以使用 git log 命令查看。
-
$ git log commit d5e9fc2c811e0ca2b2d28506ef7dc14171a207d9 (HEAD -> master) Merge: c68142b 7774248 Author: runoob <test@runoob.com> Date: Fri May 3 15:55:58 2019 +0800 Merge branch 'change_site' commit c68142b562c260c3071754623b08e2657b4c6d5b Author: runoob <test@runoob.com> Date: Fri May 3 15:52:12 2019 +0800 修改代码 commit 777424832e714cf65d3be79b50a4717aea51ab69 (change_site) Author: runoob <test@runoob.com> Date: Fri May 3 15:49:26 2019 +0800 changed the runoob.php commit c1501a244676ff55e7cccac1ecac0e18cbf6cb00 Author: runoob <test@runoob.com> Date: Fri May 3 15:35:32 2019 +0800
-
我们可以用 --oneline 选项来查看历史记录的简洁的版本。
-
$ git log --oneline $ git log --oneline d5e9fc2 (HEAD -> master) Merge branch 'change_site' c68142b 修改代码 7774248 (change_site) changed the runoob.php c1501a2 removed test.txt、add runoob.php 3e92c19 add test.txt 3b58100 第一次版本提交
-
这告诉我们的是,此项目的开发历史。
-
我们还可以用 --graph 选项,查看历史中什么时候出现了分支、合并。以下为相同的命令,开启了拓扑图选项:
-
* d5e9fc2 (HEAD -> master) Merge branch 'change_site' |\ | * 7774248 (change_site) changed the runoob.php * | c68142b 修改代码 |/ * c1501a2 removed test.txt、add runoob.php * 3e92c19 add test.txt * 3b58100 第一次版本提交
-
现在我们可以更清楚明了地看到何时工作分叉、又何时归并。
-
你也可以用 --reverse 参数来逆向显示所有日志。
-
$ git log --reverse --oneline 3b58100 第一次版本提交 3e92c19 add test.txt c1501a2 removed test.txt、add runoob.php 7774248 (change_site) changed the runoob.php c68142b 修改代码 d5e9fc2 (HEAD -> master) Merge branch 'change_site'
-
如果只想查找指定用户的提交日志可以使用命令:git log --author , 例如,比方说我们要找 Git 源码中 Linus 提交的部分:
-
$ git log --author=Linus --oneline -5 81b50f3 Move 'builtin-*' into a 'builtin/' subdirectory 3bb7256 make "index-pack" a built-in 377d027 make "git pack-redundant" a built-in b532581 make "git unpack-file" a built-in 112dd51 make "mktag" a built-in
-
如果你要指定日期,可以执行几个选项:--since 和 --before,但是你也可以用 --until 和 --after。
-
例如,如果我要看 Git 项目中三周前且在四月十八日之后的所有提交,我可以执行这个(我还用了 --no-merges 选项以隐藏合并提交):
-
$ git log --oneline --before={3.weeks.ago} --after={2010-04-18} --no-merges 5469e2d Git 1.7.1-rc2 d43427d Documentation/remote-helpers: Fix typos and improve language 272a36b Fixup: Second argument may be any arbitrary string b6c8d2d Documentation/remote-helpers: Add invocation section 5ce4f4e Documentation/urls: Rewrite to accomodate transport::address 00b84e9 Documentation/remote-helpers: Rewrite description 03aa87e Documentation: Describe other situations where -z affects git diff 77bc694 rebase-interactive: silence warning when no commits rewritten 636db2c t3301: add tests to use --format="%N"
-
git blame
-
如果要查看指定文件的修改记录可以使用 git blame 命令,格式如下:
-
git blame <file>
-
git blame 命令是以列表形式显示修改记录,如下实例:
-
$ git blame README ^d2097aa (tianqixin 2020-08-25 14:59:25 +0800 1) db9315b0 (runoob 2020-08-25 16:00:23 +0800 2)
2.8 文件删除
git rm 命令用于删除文件。
如果只是简单地从工作目录中手工删除文件,运行 git status 时就会在 Changes not staged for commit 的提示。
git rm 删除文件有以下几种形式:
1、将文件从暂存区和工作区中删除:
git rm <file>
以下实例从暂存区和工作区中删除 runoob.txt 文件:
git rm runoob.txt
如果删除之前修改过并且已经放到暂存区域的话,则必须要用强制删除选项 -f。
强行从暂存区和工作区中删除修改后的 runoob.txt 文件:
git rm -f runoob.txt
如果想把文件从暂存区域移除,但仍然希望保留在当前工作目录中,换句话说,仅是从跟踪清单中删除,使用 --cached 选项即可:
git rm --cached <file>
以下实例从暂存区中删除 runoob.txt 文件:
git rm --cached runoob.txt
可以递归删除,即如果后面跟的是一个目录做为参数,则会递归删除整个目录中的所有子目录和文件:
git rm –r *
2.9 移动或重命名
git mv 命令用于移动或重命名一个文件、目录或软连接。
git mv [file] [newfile]
2.10 回退版本
回退这部分一直没能深刻理解,等以后理解深刻一点再进行深刻详细的说明
git reset 命令
git reset 命令用于回退版本,可以指定退回某一次提交的版本。
git reset 命令语法格式如下:
git reset [--soft | --mixed | --hard] [HEAD] #[--soft | --mixed | --hard]参数选择一个就可以,HEAD上加多少^代表回退多少版本
--mixed 为默认,可以不用带该参数,用于重置暂存区的文件与上一次的提交(commit)保持一致,工作区文件内容保持不变。
git reset [HEAD]
实例:
git reset HEAD^ # 回退所有内容到上一个版本
git reset HEAD^ hello.php # 回退 hello.php 文件的版本到上一个版本
git reset 052e # 回退到指定版本
--soft 参数用于重置工作区内容与上一次提交(commit)保持一致,暂存区文件内容保持不变
--soft 参数用于回退到某个版本:
git reset --soft HEAD
实例:
git reset --soft HEAD~3 # 回退上上上一个版本
--hard 参数撤销工作区中所有未提交的修改内容,将暂存区与工作区都回到上一次版本,并删除之前的所有信息提交:
git reset --hard HEAD
实例:
git reset --hard HEAD~3 # 回退上上上一个版本
git reset –hard bae128 # 回退到某个版本回退点之前的所有信息。(未理解)
git reset --hard origin/master # 将本地的状态回退到和远程的一样
注意:谨慎使用 –-hard 参数,它会删除回退点之前的所有信息。
git reset HEAD
git reset HEAD 命令用于取消已缓存的内容。
我们先改动文件 README 文件,内容如下:
# Runoob Git 测试
# 菜鸟教程
hello.php 文件修改为:
<?php
echo 'baidu:www.baidu.com';
echo 'baidu:www.baidu.com';
echo 'baidu:www.baidu.com';
?>
现在两个文件修改后,都提交到了缓存区,我们现在要取消其中一个的缓存,操作如下:
git status -s
M README
M hello.php
git add .
git status -s
M README
M hello.php
git reset HEAD hello.php
Unstaged changes after reset:
M hello.php
git status -s
M README
M hello.php
现在你执行 git commit,只会将 README 文件的改动提交,而 hello.php 是没有的。
git commit -m '修改'
[master f50cfda] 修改
1 file changed, 1 insertion(+)
git status -s
M hello.php
可以看到 hello.php 文件的修改并未提交。
这时我们可以使用以下命令将 hello.php 的修改提交:
git commit -am '修改 hello.php 文件'
[master 760f74d] 修改 hello.php 文件
1 file changed, 1 insertion(+)
git status
On branch master
nothing to commit, working directory clean
简而言之,执行 git reset HEAD 以取消之前 git add 添加,但不希望包含在下一提交快照中的缓存。
本笔记内容整理过程中参考黑马程序员视频课与菜鸟教程