# git-study **Repository Path**: itldg/git-study ## Basic Information - **Project Name**: git-study - **Description**: 学习Git 练习Git 基础操作 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2022-02-21 - **Last Updated**: 2024-11-04 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Git学习测试 本仓库仅为练习Git的各种基本操作 命令大部分参考[菜鸟教程](https://www.runoob.com/git/git-tutorial.html) ## 命令大全 ### 创建仓库命令 命令|说明 ---|--- [git init](#初始化仓库)|初始化仓库 [git clone](#克隆仓库)|拷贝一份远程仓库,也就是下载一个项目。 ### 提交与修改 Git 的工作就是创建和保存你的项目的快照及与之后的快照进行对比。 下表列出了有关创建与提交你的项目的快照的命令: 命令|说明 ---|--- [git add](#add添加到暂存区)|添加文件到暂存区 [git status](#status查看状态)|查看仓库当前的状态,显示有变更的文件。 [git diff](#diff比较差异)|比较文件的不同,即暂存区和工作区的差异。 [git commit](#commit提交暂存)|提交暂存区到本地仓库。 [git reset](#reset回退版本)|回退版本。 [git rm](#rm删除文件)|删除工作区文件。 [git mv](#mv移动或重命名)|移动或重命名工作区文件。 ## 实操 ### 初始化仓库 **git init** 命令用于在目录中创建新的 Git 仓库。 在目录中执行 `git init` 就可以创建一个 Git 仓库了。 例如我们在当前目录下创建一个名为 ldg 的项目: ```bash $ mkdir ldg $ cd ldg/ $ git init Initialized empty Git repository in /Users/itldg/ldg/.git/ # 初始化空 Git 仓库完毕。 ``` 现在你可以看到在你的项目中生成了 **.git** 这个子目录,这就是你的 Git 仓库了,所有有关你的此项目的快照数据都存放在这里。 `.git` 默认是隐藏的,可以用 `ls -a` 命令查看: ```bash ls -a . .. .git ``` ### 克隆仓库 **git clone** 拷贝一个 Git 仓库到本地,让自己能够查看该项目,或者进行修改。 拷贝项目命令格式如下: ```bash git clone [url] ``` `[url] `是你要拷贝的项目。 例如我们拷贝 Gitee 上的项目: ```bash $ git clone https://gitee.com/diycms/git-study Cloning into 'git-study'... remote: Enumerating objects: 14, done. remote: Counting objects: 100% (11/11), done. remote: Compressing objects: 100% (5/5), done. remote: Total 14 (delta 0), reused 0 (delta 0), pack-reused 3 Receiving objects: 100% (14/14), done. ``` 拷贝完成后,在当前目录下会生成一个 **git-study** 目录: ```bash $ cd git-study/ $ ls README.md ``` 上述操作将复制该项目的全部记录。 ``` bash $ ls -a . .. .git README.md $ cd .git $ ls HEAD description index logs packed-refs config hooks info objects refs ``` 默认情况下,Git 会按照你提供的 URL 所指向的项目的名称创建你的本地项目目录。 通常就是该 URL 最后一个 / 之后的项目名称。如果你想要一个不一样的名字, 你可以在该命令后加上你想要的名称。 例如,以下实例拷贝远程 git 项目,本地项目名为 itldg: ```bash $ git clone https://gitee.com/diycms/git-study itldg Cloning into 'itldg'... remote: Enumerating objects: 14, done. remote: Counting objects: 100% (11/11), done. remote: Compressing objects: 100% (5/5), done. remote: Total 14 (delta 0), reused 0 (delta 0), pack-reused 3 Receiving objects: 100% (14/14), done. ``` ### add添加到暂存区 **git add** 命令可将该文件添加到暂存区。 添加一个或多个文件到暂存区: >git add [file1] [file2] ... 添加指定目录到暂存区,包括子目录: >git add [dir] 添加当前目录下的所有文件到暂存区: >git add . 以下实例我们添加两个文件: ```bash $ touch test1.md # 创建文件 $ touch test2.md # 创建文件 $ ls test1.md test2.md $ git status -s ?? test1.md ?? test2.md ``` **git status** 命令用于查看项目的当前状态。 接下来我们执行 git add 命令来添加文件: ```bash $ git add test1.md test2.md ``` 现在我们再执行 git status,就可以看到这两个文件已经加上去了。 ```bash $ git status -s A test1.md A test2.md ``` 新项目中,添加所有文件很普遍,我们可以使用 git add . 命令来添加当前项目的所有文件。 现在我们修改 test1.md 文件: ``` bash $ vim test1.md ``` 在 test1.md 添加以下内容: **# 测试更改文件** 然后保存退出。 再执行一下 git status: ```bash $ git status -s AM test1.md A test2.md ``` `AM` 状态的意思是这个文件在我们将它添加到缓存之后又有改动。 改动后我们再执行 `git add .` 命令将其添加到缓存中: ```bash $ git add . $ git status -s A test1.md A test2.md ``` 文件修改后,我们一般都需要进行 `git add` 操作,从而保存历史版本。 ### status查看状态 **git status** 命令用于查看在你上次提交之后是否有对文件进行再次修改。 ```bash $ git status On branch master Initial commit Changes to be committed: (use "git rm --cached ..." to unstage) new file: README new file: hello.php ``` 通常我们使用 `-s` 参数来获得简短的输出结果: ```bash $ git status -s AM README A hello.php ``` `AM` 状态的意思是这个文件在我们将它添加到缓存之后又有改动。 ### diff比较差异 **git diff** 命令比较文件的不同,即比较文件在暂存区和工作区的差异。 **git diff** 命令显示已写入暂存区和已经被修改但尚未写入暂存区文件的区别。 **git diff** 有两个主要的应用场景。 - 尚未缓存的改动:`git diff` - 查看已缓存的改动: `git diff --cached` - 查看已缓存的与未缓存的所有改动:`git diff HEAD` - 显示摘要而非整个 diff:`git diff --stat` 显示暂存区和工作区的差异: ```bash $ git diff [file] ``` 显示暂存区和上一次提交(commit)的差异: ```bash $ git diff --cached [file] ``` 或 ```bash $ git diff --staged [file] ``` 显示两次提交之间的差异: ```bash $ git diff [first-branch]...[second-branch] ``` 在 hello.php 文件中输入以下内容: ```php ``` 使用 `git status -s` 查看状态: ```bash $ git status -s ?? 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 @@ + ``` `git status` 显示你上次提交更新后的更改或者写入缓存的改动, 而 `git diff` 一行一行地显示这些改动具体是啥。 接下来我们来查看下 `git diff --cached` 的执行效果: ```bash $ git add hello.php $ git status -s A hello.php $ git diff --cached diff --git a/hello.php b/hello.php new file mode 100644 index 0000000..69b5711 --- /dev/null +++ b/hello.php @@ -0,0 +1,3 @@ + ``` ### commit提交暂存 前面章节我们使用 `git add` 命令将内容写入暂存区。 **git commit** 命令将暂存区内容添加到本地仓库中。 提交暂存区到本地仓库中: ```bash git commit -m [message] ``` `[message]` 可以是一些备注信息。 提交暂存区的指定文件到仓库区: ```bash $ git commit [file1] [file2] ... -m [message] ``` `-a` 参数设置修改文件后不需要执行 `git add` 命令,直接来提交 ```bash $ git commit -a ``` 设置提交代码时的用户信息 开始前我们需要先设置提交的用户信息,包括用户名和邮箱: ```bash $ git config --global user.name 'runoob' $ git config --global user.email test@runoob.com ``` 如果去掉 `--global` 参数只对当前仓库有效。 #### 提交修改 接下来我们就可以对 hello.php 的所有改动从暂存区内容添加到本地仓库中。 以下实例,我们使用 `-m` 选项以在命令行中提供提交注释。 ```bash $ 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 ``` 现在我们已经记录了快照。如果我们再执行 `git status`: ```bash $ git status # On branch master nothing to commit (working directory clean) ``` 以上输出说明我们在最近一次提交之后,没有做任何改动,是一个 "working directory clean",翻译过来就是干净的工作目录。 如果你没有设置 `-m` 选项,Git 会尝试为你打开一个编辑器以填写提交信息。 如果 Git 在你对它的配置中找不到相关信息,默认会打开 vim。屏幕会像这样: ```bash # Please enter the commit message for your changes. Lines starting # with '#' will be ignored, and an empty message aborts the commit. # On branch master # Changes to be committed: # (use "git reset HEAD ..." to unstage) # # modified: hello.php # ~ ~ ".git/COMMIT_EDITMSG" 9L, 257C ``` 如果你觉得 `git add` 提交缓存的流程太过繁琐,Git 也允许你用 `-a` 选项跳过这一步。命令格式如下: `git commit -a` 我们先修改 hello.php 文件为以下内容: ```php ``` 再执行以下命令: ```bash $ git commit -am '修改 hello.php 文件' [master 71ee2cb] 修改 hello.php 文件 1 file changed, 1 insertion(+) ``` ### reset回退版本 **git reset** 命令用于回退版本,可以指定退回某一次提交的版本。 > 数据无价,谨慎操作 `git reset` 命令语法格式如下: ```bash git reset [--soft | --mixed | --hard] [HEAD] ``` `--mixed` 为默认,可以不用带该参数,用于重置暂存区的文件与上一次的提交(commit)保持一致,工作区文件内容保持不变。 ```bash git reset [HEAD] ``` 实例: ```bash $ git reset HEAD^ # 回退所有内容到上一个版本 $ git reset HEAD^ hello.php # 回退 hello.php 文件的版本到上一个版本 $ git reset 052e # 回退到指定版本 ``` `--soft` 参数用于回退到某个版本: ```bash git reset --soft HEAD ``` 实例: ```bash $ git reset --soft HEAD~3 # 回退上上上一个版本 ``` `--hard` 参数撤销工作区中所有未提交的修改内容,将暂存区与工作区都回到上一次版本,并删除之前的所有信息提交: ```bash git reset --hard HEAD ``` 实例: ```bash $ git reset –hard HEAD~3 # 回退上上上一个版本 $ git reset –hard bae128 # 回退到某个版本回退点之前的所有信息。 $ git reset --hard origin/master # 将本地的状态回退到和远程的一样 ``` >注意:谨慎使用 `–hard` 参数,它会删除回退点之前的所有信息。 HEAD 说明: - HEAD 表示当前版本 - HEAD^ 上一个版本 - HEAD^^ 上上一个版本 - HEAD^^^ 上上上一个版本 - 以此类推... 可以使用 ~数字表示 - HEAD~0 表示当前版本 - HEAD~1 上一个版本 - HEAD^2 上上一个版本 - HEAD^3 上上上一个版本 - 以此类推... **git reset HEAD** `git reset HEAD` 命令用于取消已缓存的内容。 我们先改动文件 README 文件,内容如下: ```makedown # Runoob Git 测试 # 菜鸟教程 ``` hello.php 文件修改为: ```php ``` 现在两个文件修改后,都提交到了缓存区,我们现在要取消其中一个的缓存,操作如下: ```bash $ 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 是没有的。 ```bash $ git commit -m '修改' [master f50cfda] 修改 1 file changed, 1 insertion(+) $ git status -s M hello.php ``` 可以看到 hello.php 文件的修改并未提交。 这时我们可以使用以下命令将 hello.php 的修改提交: ```bash $ 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` 添加,但不希望包含在下一提交快照中的缓存。 ### rm删除文件 **git rm** 命令用于删除文件。 如果只是简单地从工作目录中手工删除文件,运行 `git status` 时就会在 `Changes not staged for commit` 的提示。 `git rm` 删除文件有以下几种形式: 1、将文件从暂存区和工作区中删除: ```bash git rm ``` 以下实例从暂存区和工作区中删除 `runoob.txt` 文件: ```bash git rm runoob.txt ``` 如果删除之前修改过并且已经放到暂存区域的话,则必须要用强制删除选项 `-f`。 强行从暂存区和工作区中删除修改后的 `runoob.txt` 文件: ```bash git rm -f runoob.txt ``` 如果想把文件从暂存区域移除,但仍然希望保留在当前工作目录中,换句话说,仅是从跟踪清单中删除,使用 `--cached` 选项即可: ```bash git rm --cached ``` 以下实例从暂存区中删除 `runoob.txt` 文件: ```bash git rm --cached runoob.txt ``` 实例 删除 `hello.php` 文件: ```bash $ git rm hello.php rm 'hello.php' $ ls README ``` 文件从暂存区域移除,但工作区保留: ```bash $ git rm --cached README rm 'README' $ ls README ``` 可以递归删除,即如果后面跟的是一个目录做为参数,则会递归删除整个目录中的所有子目录和文件: ```bash git rm –r * ``` 进入某个目录中,执行此语句,会删除该目录下的所有文件和子目录。 ### mv移动或重命名 **git mv** 命令用于移动或重命名一个文件、目录或软连接。 ```bash git mv [file] [newfile] ``` 如果新文件名已经存在,但还是要重命名它,可以使用 `-f` 参数: ```bash git mv -f [file] [newfile] ``` 我们可以添加一个 `README` 文件(如果没有的话): ```bash git add README ``` 然后对其重命名: ```bash $ git mv README README.md $ ls README.md ```