Git 基本操作

目录

创建仓库命令

git init

git clone

提交与修改

git add

git status

git diff

git commit

git reset

git rm

git mv

git checkout

git switch

git restore

提交日志

git log

git blame

远程操作

git remote

git fetch

git pull

git push


Git 的工作就是创建和保存你项目的快照及与之后的快照进行对比。

本章将对有关创建与提交你的项目快照的命令作介绍。

Git 常用的是以下 6 个命令:git clonegit pushgit addgit commitgit checkoutgit pull,后面我们会详细介绍。

https://www.runoob.com/wp-content/uploads/2015/02/git-command.jpg

说明:

  • workspace:工作区
  • staging area:暂存区/缓存区
  • local repository:版本库或本地仓库
  • remote repository:远程仓库

一个简单的操作步骤:

$ git init   

$ git add .   

$ git commit  
  • git init - 初始化仓库。
  • git add . - 添加文件到暂存区。
  • git commit - 将暂存区内容添加到仓库中。

创建仓库命令

下表列出了 git 创建仓库的命令:

git init

git init 命令用于在目录中创建新的 Git 仓库。

在目录中执行 git init 就可以创建一个 Git 仓库了。

例如我们在当前目录下创建一个名为 runoob 的项目:

实例

$ mkdir runoob
$ cd runoob/
$ git init
Initialized empty Git repository in /Users/xxx/www/runoob/.git/
# 初始化空 Git 仓库完毕。

现在你可以看到在你的项目中生成了 .git 这个子目录,这就是你的 Git 仓库了,所有有关你的此项目的所有内容和元数据都存放在这里。

执行完上述步骤后,你就创建了一个新的 Git 仓库,你可以使用其他 Git 命令(如 git add、git commit 等)来管理和跟踪你的代码变更,并与远程仓库进行交互。

注意:git init 命令只用于在一个空目录中创建新仓库,如果你想要克隆(clone)一个已存在的远程仓库到本地,请使用 git clone 命令。

.git 默认是隐藏的,可以用 ls -a 命令查看

git clone

git clone 是一个用于克隆(clone)远程 Git 仓库到本地的命令。

git clone 可以将一个远程 Git 仓库拷贝到本地,让自己能够查看该项目,或者进行修改。

git clone 命令,你可以复制远程仓库的所有代码和历史记录,并在本地创建一个与远程仓库相同的仓库副本。

拷贝项目命令格式如下:

 git clone [url]

[url] 是你要拷贝的项目。

例如我们拷贝 Github 上的项目:

$ git clone https://github.com/tianqixin/runoob-git-test
Cloning into 'runoob-git-test'...
remote: Enumerating objects: 12, done.
remote: Total 12 (delta 0), reused 0 (delta 0), pack-reused 12
Unpacking objects: 100% (12/12), done.

执行完上述步骤后,Git 会克隆远程仓库到本地,并在当前目录下创建一个与远程仓库同名的文件夹(例如上面示例中的 runoob-git-test 文件夹)。

以上命令执行完成后,在当前目录下会生成一个 runoob-git-test 目录;

上述操作将复制该项目的全部记录。

git clone 命令会自动将远程仓库的所有分支和历史记录复制到本地,你可以使用其他 Git 命令(如 git checkout、git pull 等)在本地仓库进行操作。

默认情况下,Git 会按照你提供的 URL 所指向的项目的名称创建你的本地项目目录。 通常就是该 URL 最后一个 / 之后的项目名称。如果你想要一个不一样的名字, 你可以在该命令后加上你想要的名称。

例如,以下实例拷贝远程 git 项目,本地项目名为 another-runoob-name

$ git clone https://github.com/tianqixin/runoob-git-test another-runoob-name
Cloning into 'another-runoob-name'...
remote: Enumerating objects: 12, done.
remote: Total 12 (delta 0), reused 0 (delta 0), pack-reused 12
Unpacking objects: 100% (12/12), done.

提交与修改

Git 的工作就是创建和保存你的项目的快照及与之后的快照进行对比。

下表列出了有关创建与提交你的项目的快照的命令:

git add

git add 命令可将该文件的修改添加到暂存区。

通过运行 git add 命令,你可以告诉 Git 哪些文件的修改应该包含在下一次提交(commit)中。

添加一个或多个文件到暂存区:

git add [file1] [file2] ...

添加指定目录到暂存区,包括子目录:

git add [dir]

添加当前目录下的所有文件到暂存区:

git add .

以下实例我们添加两个文件:

$ touch README                # 创建文件
$ touch hello.php             # 创建文件
$ ls
README        hello.php
$ git status -s
?? README
?? hello.php
$ 

https://www.runoob.com/wp-content/uploads/2015/02/B8B4BCDD-158E-4A48-AF22-55CBE0D89F62.jpg

git status 命令用于查看项目的当前状态。

接下来我们执行 git add 命令来添加文件:

$ git add README hello.php 

现在我们再执行 git status,就可以看到这两个文件已经加上去了。

$ git status -s
A  README
A  hello.php
$ 

https://www.runoob.com/wp-content/uploads/2020/08/C87C909B-94F9-496B-B942-1FE9DD464843.jpg

新项目中,添加所有文件很普遍,我们可以使用 git add . 命令来添加当前项目的所有文件。

现在我们修改 README 文件:

$ vim README

在 README 添加以下内容:# Runoob Git 测试,然后保存退出。

再执行一下 git status:

$ git status -s
AM README
A  hello.php

https://www.runoob.com/wp-content/uploads/2020/08/F3B705BE-7D52-46E7-BF64-EA0EFCC52373.jpg

AM 状态的意思是这个文件在我们将它添加到缓存之后又有改动。改动后我们再执行 git add . 命令将其添加到缓存中:

$ git add .
$ git status -s
A  README
A  hello.php

文件修改后,我们一般都需要进行 git add 操作,从而保存历史版本。

git status

查看仓库当前的状态,显示有变更的文件。

git status 是一个用于查看 Git 仓库当前状态的命令。

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

git status 命令会显示以下信息:

当前分支的名称。

当前分支与远程分支的关系(例如,是否是最新的)。

未暂存的修改:显示已修改但尚未使用 git add 添加到暂存区的文件列表。

未跟踪的文件:显示尚未纳入版本控制的新文件列表。

根据 git status 的输出,你可以判断当前工作目录中的文件状态,并采取适当的操作。

通常我们使用 -s 参数来获得简短的输出结果:

$ git status -s
AM README
A  hello.php

https://www.runoob.com/wp-content/uploads/2020/08/F3B705BE-7D52-46E7-BF64-EA0EFCC52373.jpg

AM 状态的意思是这个文件在我们将它添加到缓存之后又有改动。

git 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 '新手教程:www.runoob.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 '新手教程:www.runoob.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 '新手教程:www.runoob.com';
+?>

git commit

前面章节我们使用 git add 命令将内容写入暂存区。

git commit 命令将暂存区内容添加到本地仓库中。

提交暂存区到本地仓库中:

git commit -m [message]

[message] 可以是一些备注信息。

提交暂存区的指定文件到仓库区:

$ git commit [file1] [file2] ... -m [message]

-a 参数设置修改文件后不需要执行 git add 命令,直接来提交

$ git commit -a

设置提交代码时的用户信息

开始前我们需要先设置提交的用户信息,包括用户名和邮箱:

$ git config --global user.name 'runoob'

$ git config --global user.email test@runoob.com

如果去掉 --global 参数只对当前仓库有效。

提交修改

接下来我们就可以对 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

现在我们已经记录了快照。如果我们再执行 git status:

$ git status
# On branch master
nothing to commit (working directory clean)

以上输出说明我们在最近一次提交之后,没有做任何改动,是一个 "working directory clean",翻译过来就是干净的工作目录。

如果你没有设置 -m 选项,Git 会尝试为你打开一个编辑器以填写提交信息。 如果 Git 在你对它的配置中找不到相关信息,默认会打开 vim。屏幕会像这样:

# 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 <file>..." to unstage)
#
# modified:   hello.php
#
~
~
".git/COMMIT_EDITMSG" 9L, 257C

如果你觉得 git add 提交缓存的流程太过繁琐,Git 也允许你用 -a 选项跳过这一步。命令格式如下:

git commit -a

我们先修改 hello.php 文件为以下内容:

<?php
echo '新手教程:www.runoob.com';
echo '新手教程:www.runoob.com';
?>

再执行以下命令:

$ git commit -am '修改 hello.php 文件'
[master 71ee2cb] 修改 hello.php 文件
 1 file changed, 1 insertion(+)

git reset

git reset 命令用于回退版本,可以指定退回某一次提交的版本。

git reset 命令语法格式如下:

git reset [--soft | --mixed | --hard] [HEAD]

--mixed 为默认,可以不用带该参数,用于重置暂存区的文件与上一次的提交(commit)保持一致,工作区文件内容保持不变。

git reset  [HEAD] 

实例:

$ git reset HEAD^            # 回退所有内容到上一个版本 
$ git reset HEAD^ hello.php  # 回退 hello.php 文件的版本到上一个版本 
$ git  reset  052e           # 回退到指定版本

--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 参数,它会删除回退点之前的所有信息。

HEAD 说明:

HEAD 表示当前版本

HEAD^ 上一个版本

HEAD^^ 上上一个版本

HEAD^^^ 上上上一个版本

以此类推...

可以使用 ~数字表示

HEAD~0 表示当前版本

HEAD~1 上一个版本

HEAD^2 上上一个版本

HEAD^3 上上上一个版本

以此类推...

git reset HEAD

git reset HEAD 命令用于取消已缓存的内容。

我们先改动文件 README 文件,内容如下:

# Runoob Git 测试
# 新手教程 

hello.php 文件修改为:

<?php
echo '新手教程:www.runoob.com';
echo '新手教程:www.runoob.com';
echo '新手教程:www.runoob.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 添加,但不希望包含在下一提交快照中的缓存。

git rm

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

实例

删除 hello.php 文件:

$ git rm hello.php
rm 'hello.php'

$ ls
README

文件从暂存区域移除,但工作区保留:

$ git rm --cached README
rm 'README'
$ ls
README

可以递归删除,即如果后面跟的是一个目录做为参数,则会递归删除整个目录中的所有子目录和文件:

git rm –r * 

进入某个目录中,执行此语句,会删除该目录下的所有文件和子目录。

git mv

git mv 命令用于移动或重命名一个文件、目录或软连接。

git mv [file] [newfile]

如果新文件名已经存在,但还是要重命名它,可以使用 -f 参数:

git mv -f [file] [newfile]

我们可以添加一个 README 文件(如果没有的话):

$ git add README 

然后对其重命名:

$ git mv README  README.md
$ ls
README.md

git checkout

git checkout 命令用于在不同的分支之间切换、恢复文件、创建新分支等操作。

注意:git checkout 命令在 Git 2.23 版本后引入了 git switch 和 git restore 命令,分别用于分支切换和文件恢复,以提供更清晰的语义和错误检查。如果你使用较新的 Git 版本,可以考虑使用这些命令代替 git checkout。

切换分支:

以下命令允许你从当前分支切换到指定的分支 <branch-name>:

git checkout <branch-name>

例如将你的工作目录切换到主分支:

git checkout master 

创建新分支并切换:

以下命令用于创建一个新分支 <new-branch-name> 并立即切换到新创建的分支:

git checkout -b <new-branch-name>

例如创建一个名为 feature-branch 的新分支并切换到它:

git checkout -b feature-branch

切换到前一个分支:

以下命令可以让你快速切换回前一个分支,无需记住分支名称:

git checkout -

检出文件:

以下命令可以将指定文件 <file> 恢复到最新的提交状态,丢弃所有未提交的更改,这对于撤销不需要的更改非常有用:

git checkout -- <file>

切换到特定提交:

你可以使用提交的哈希值 <commit-hash> 来切换到特定的提交状态。这将使你进入"分离头指针"状态,只能查看历史记录,而不能进行分支操作。通常情况下,不建议在分离头指针状态下工作,因为更改可能会丢失。

git checkout <commit-hash>

切换到标签:

如果你有一个标签 <tag-name>,你可以使用这个命令来切换到该标签所指向的提交状态。

git checkout tags/<tag-name>

git switch

git switch 命令用于更清晰地切换分支(Git 2.23 版本引入)。

git switch 命令作用与 git checkout 类似,但提供了更清晰的语义和错误检查。

切换分支

以下命令允许你从当前分支切换到指定的分支 <branch-name>:

git switch <branch-name>

例如将你的工作目录切换到主分支:

git switch master 

创建新分支并切换

如果你想同时创建一个新分支并切换到该分支,可以在 git switch 命令后面加上 -c--create 选项,然后指定分支名称。

以下命令用于创建一个新分支 <new-branch-name> 并立即切换到新创建的分支:

git switch -c <new-branch-name>

例如创建一个名为 feature-branch 的新分支并切换到它:

git switch -c feature-branch

这将创建一个名为 "feature-branch" 的新分支,并将你的工作目录切换到该分支上。

切换到前一个分支

以下命令可以让你快速切换回前一个分支,无需记住分支名称:

git switch -

切换到标签

如果你有一个标签 <tag-name>,你可以使用这个命令来切换到该标签所指向的提交状态:

git switch tags/<tag-name>

查看可用分支和标签

以下命令可以让你列出可用的本地分支和标签,以便快速选择要切换的目标:

git branch与 git checkout 不同,git switch 更容易理解和使用,因为它专注于分支切换的操作,此外,git switch 还提供了更好的错误检查,可以避免一些常见的错误操作。

注意:git switch 是 Git 2.23 版本引入的一个新命令,如果你使用的是 Git 的旧版本,可能无法使用 git switch 命令,但你仍然可以使用 git checkout 进行相同的操作。

git restore

git restore 命令用于恢复或撤销文件的更改(Git 2.23 版本引入)。

git restore 命令作用包括还原文件到最新提交的状态、丢弃未暂存的更改、丢弃已暂存但未提交的更改等。

还原文件到最新提交的状态

以下命令可以将指定文件 <file> 恢复到最新的提交状态,丢弃所有未提交的更改:

git restore <file>

这个命令对于撤销不需要的更改非常有用。

还原文件到暂存区的状态

如果你已经使用 git add 将文件添加到暂存区,但希望撤销这些更改,可以使用这个命令:

git restore --staged <file>

以上命令将文件 <file> 恢复到暂存区的状态,但不影响工作目录中的文件。

还原全部更改

以下命令将还原所有未提交的更改,包括工作目录和暂存区的更改:

git restore .

使用这个命令要谨慎,因为它会清除所有未提交的修改。

还原文件到指定提交的状态

如果你想将文件 <file> 恢复到特定提交 <commit> 的状态,可以使用以下命令:

git restore --source=<commit> <file>

这个命令在需要查看历史状态或将文件还原到历史版本时非常有用。

交互式还原:

以下命令允许你以交互方式选择要还原或保留的更改:

git restore -i

执行这个命令它会打开一个交互式界面,让你选择如何处理每个更改。

git restore 的目标是提供一种更直观、易于理解的方式来管理文件的状态,它的引入使得 Git 用户能够更容易地处理不同阶段的更改,从而提高了工作流的效率。

注意:git restore 是 Git 2.23 版本引入的一个命令,如果你使用的是较早版本的 Git,可能无法使用 git restore 命令,但你仍然可以使用 git checkout 等命令来进行类似的操作。

提交日志

git log

git log - 查看历史提交记录。

git log

在使用 Git 提交了若干更新之后,又或者克隆了某个项目,想回顾下提交历史,我们可以使用 git log 命令查看。

git log 命令用于查看 Git 仓库中提交历史记录。

git log 显示了从最新提交到最早提交的所有提交信息,包括提交的哈希值、作者、提交日期和提交消息等。

git log 命令的基本语法:

git log [选项] [分支名/提交哈希]

常用的选项包括:

-p:显示提交的补丁(具体更改内容)。

--oneline:以简洁的一行格式显示提交信息。

--graph:以图形化方式显示分支和合并历史。

--decorate:显示分支和标签指向的提交。

--author=<作者>:只显示特定作者的提交。

--since=<时间>:只显示指定时间之后的提交。

--until=<时间>:只显示指定时间之前的提交。

--grep=<模式>:只显示包含指定模式的提交消息。

--no-merges:不显示合并提交。

--stat:显示简略统计信息,包括修改的文件和行数。

--abbrev-commit:使用短提交哈希值。

--pretty=<格式>:使用自定义的提交信息显示格式。

针对我们前一章节的操作,使用 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

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 log 命令可查看 Git - git-log Documentation 或使用 git log --help 命令查看帮助信息。

git blame <file>

以列表形式查看指定文件的历史修改记录

git blame 命令用于逐行显示指定文件的每一行代码是由谁在什么时候引入或修改的。

strong>git blame 可以追踪文件中每一行的变更历史,包括作者、提交哈希、提交日期和提交消息等信息。

如果要查看指定文件的修改记录可以使用 git blame 命令,格式如下:

git blame [选项] <文件路径>

常用的选项包括:

-L <起始行号>,<结束行号>:只显示指定行号范围内的代码注释。

-C:对于重命名或拷贝的代码行,也进行代码行溯源。

-M:对于移动的代码行,也进行代码行溯源。

-C -C-M -M:对于较多改动的代码行,进行更进一步的溯源。

--show-stats:显示包含每个作者的行数统计信息。

显示文件每一行的代码注释和相关信息:

git blame <文件路径>

只显示指定行号范围内的代码注释:

git blame -L <起始行号>,<结束行号> <文件路径>

对于重命名或拷贝的代码行进行溯源:

git blame -C <文件路径>

对于移动的代码行进行溯源:

git blame -M <文件路径>

显示行数统计信息:

git blame --show-stats <文件路径>

git blame 命令是以列表形式显示修改记录,如下实例:

$ git blame README

^d2097aa (tianqixin 2020-08-25 14:59:25 +0800 1) # Runoob Git 测试
db9315b0 (runoob    2020-08-25 16:00:23 +0800 2) # 新手教程 

远程操作

git remote

git remote 命令用于用于管理 Git 仓库中的远程仓库。

git remote 命令提供了一些用于查看、添加、重命名和删除远程仓库的功能。

以下是 git remote 命令的常见用法:

  1. git remote:列出当前仓库中已配置的远程仓库。
  2. git remote -v:列出当前仓库中已配置的远程仓库,并显示它们的 URL。
  3. git remote add <remote_name> <remote_url>:添加一个新的远程仓库。指定一个远程仓库的名称和 URL,将其添加到当前仓库中。
  4. git remote rename <old_name> <new_name>:将已配置的远程仓库重命名。
  5. git remote remove <remote_name>:从当前仓库中删除指定的远程仓库。
  6. git remote set-url <remote_name> <new_url>:修改指定远程仓库的 URL。
  7. git remote show <remote_name>:显示指定远程仓库的详细信息,包括 URL 和跟踪分支。

以下列出了远程仓库、添加远程仓库、重命名远程仓库、删除远程仓库、修改远程仓库 URL 和查看远程仓库信息的用法:

git remote

git remote -v

git remote add origin https://github.com/user/repo.git

git remote rename origin new-origin

git remote remove new-origin

git remote set-url origin https://github.com/user/new-repo.git

git remote show origin

应用实例

本章节内容我们将以 Github 作为远程仓库来操作,所以阅读本章节前需要先阅读关于 Github 的相关内容:Git 远程仓库(Github)

显示所有远程仓库:

git remote -v

git remote -v 可以查看当前仓库中配置的远程仓库列表以及它们的 URL。

以下我们先载入远程仓库,然后查看信息:

$ git clone https://github.com/tianqixin/runoob-git-test
$ cd runoob-git-test
$ git remote -v
origin  https://github.com/tianqixin/runoob-git-test (fetch)
origin  https://github.com/tianqixin/runoob-git-test (push)

origin 为远程地址的别名。

显示某个远程仓库的信息:

git remote show [remote]

例如:

$ git remote show https://github.com/tianqixin/runoob-git-test

* remote https://github.com/tianqixin/runoob-git-test
  Fetch URL: https://github.com/tianqixin/runoob-git-test
  Push  URL: https://github.com/tianqixin/runoob-git-test
  HEAD branch: master
  Local ref configured for 'git push':
    master pushes to master (local out of date)

添加远程版本库:

git remote add <remote_name> <remote_url>

<remote_name>:要添加的远程仓库的名称。通常,远程仓库的名称为 origin,但你也可以自定义一个名称。

<remote_url>:远程仓库的 URL。它可以是一个指向远程 Git 仓库的 HTTPS、SSH 或 Git 协议链接。

以下命令将向当前 Git 仓库添加一个名为 origin 的远程仓库,它的 URL 是 https://github.com/user/repo.git。

git remote add origin https://github.com/user/repo.git

实例用法:

# 提交到 Github

$ git remote add origin git@github.com:tianqixin/runoob-git-test.git
$ git push -u origin master

添加远程仓库后,你就可以使用其他 Git 命令与远程仓库进行交互,例如推送本地代码到远程仓库、拉取远程仓库的代码等。

其他相关命令:

git remote rm name  # 删除远程仓库

git remote rename old_name new_name  # 修改仓库名

更多内容可以查看:Git 远程仓库(Github)。

git fetch

git fetch 命令用于从远程获取代码库。

本章节内容我们将以 Github 作为远程仓库来操作,所以阅读本章节前需要先阅读关于 Github 的相关内容:Git 远程仓库(Github)

该命令执行完后需要执行 git merge 远程分支到你所在的分支。

从远端仓库提取数据并尝试合并到当前分支:

git merge

该命令就是在执行 git fetch 之后紧接着执行 git merge 远程分支到你所在的任意分支。

假设你配置好了一个远程仓库,并且你想要提取更新的数据,你可以首先执行:

git fetch [alias]

以上命令告诉 Git 去获取它有你没有的数据,然后你可以执行:

git merge [alias]/[branch]

以上命令将服务器上的任何更新(假设有人这时候推送到服务器了)合并到你的当前分支。

本章节以 https://github.com/maling/runoob-git-test 为例。

接下来我们在 Github 上点击 README.md 并在线修改它:

然后我们在本地更新修改。

$ git fetch origin

remote: Counting objects: 3, done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (3/3), done.
From github.com:tianqixin/runoob-git-test
   0205aab..febd8ed  master     -> origin/master

以上信息"0205aab..febd8ed master -> origin/master" 说明 master 分支已被更新,我们可以使用以下命令将更新同步到本地:

$ git merge origin/master

Updating 0205aab..febd8ed
Fast-forward
 README.md | 1 +
 1 file changed, 1 insertion(+)

查看 README.md 文件内容:

$ cat README.md

# 新手教程 Git 测试
## 第一次修改内容

git pull

git pull 命令用于从远程获取代码并合并本地的版本。

git pull 其实就是 git fetch 和 git merge FETCH_HEAD 的简写。

命令格式如下:

git pull <远程主机名> <远程分支名>:<本地分支名>

实例

更新操作:

$ git pull

$ git pull origin

将远程主机 origin 的 master 分支拉取过来,与本地的 brantest 分支合并。

git pull origin master:brantest

如果远程分支是与当前分支合并,则冒号后面的部分可以省略。

git pull origin master

上面命令表示,取回 origin/master 分支,再与本地的 brantest 分支合并。

上面的 pull 操作用 fetch 表示为:

以我的 https://github.com/maling/runoob-git-test 为例,远程载入合并本地分支。

$ git remote -v  # 查看信息

origin    https://github.com/tianqixin/runoob-git-test (fetch)
origin    https://github.com/tianqixin/runoob-git-test (push)

$ git pull origin master
From https://github.com/tianqixin/runoob-git-test
 * branch            master     -> FETCH_HEAD
Already up to date.

上面命令表示,取回 origin/master 分支,再与本地的 master 分支合并。

git push

git push 命令用于从将本地的分支版本上传到远程并合并。

命令格式如下:

git push <远程主机名> <本地分支名>:<远程分支名>

如果本地分支名与远程分支名相同,则可以省略冒号:

git push <远程主机名> <本地分支名>

实例

以下命令将本地的 master 分支推送到 origin 主机的 master 分支。

$ git push origin master

相等于:

$ git push origin master:master

如果本地版本与远程版本有差异,但又要强制推送可以使用 --force 参数:

git push --force origin master

删除主机的分支可以使用 --delete 参数,以下命令表示删除 origin 主机的 master 分支:

git push origin --delete master

以我的 https://github.com/maling/runoob-git-test 为例,本地添加文件:
 

$ touch runoob-test.txt      # 添加文件

$ git add runoob-test.txt
$ git commit -m "添加到远程"
master 69e702d] 添加到远程
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 runoob-test.txt
$ git push origin master    # 推送到 Github

将本地的 master 分支推送到 origin 主机的 master 分支。

重新回到我们的 Github 仓库,可以看到文件已经提交上来了:

https://www.runoob.com/wp-content/uploads/2015/03/79A84530-7DC0-4D25-9F83-8776433A4C32.jpg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/153801.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C# NAudio 音频库

C# NAudio 音频库 NAudio安装NAudio简述简单示例1录制麦克风录制系统声卡WAV格式播放MP3格式播放AudioFileReader读取播放音频MediaFoundationReader 读取播放音频 NAudio安装 项目>NuGet包管理器 搜索NAudio点击安装&#xff0c;自动安装依赖库。 安装成功后工具箱会新增…

网站安全攻防战:守护数据的钢铁堡垒

在数字化时代&#xff0c;网站的安全性至关重要&#xff0c;因为它不仅关乎用户的隐私信息&#xff0c;还涉及到业务的正常运行。一旦网站受到攻击&#xff0c;可能导致数据泄露、服务中断等问题&#xff0c;因此网站安全应成为企业和个人关注的焦点。本文将探讨网站安全的重要…

GBase8a-GDCA-第一次阶段测试

文章目录 主要内容 总结 主要内容 GBase8a-第一阶段测试答案 总结 以上是今天要讲的内容&#xff0c;GBase8a-GDCA-第一次阶段测试题及答案。

NewStarCTF2023 Week3 Reverse方向 题目STL WP

分析 代码不多&#xff0c;逻辑挺清楚的。 先用Z3解出V7&#xff1a; from z3 import *s Solver() v1, v2, v3, v4, v5, v6 BitVecs(v1 v2 v3 v4 v5 v6, 32) v7, v8, v9, v10, v11 BitVecs(v7 v8 v9 v10 v11, 32)s.add((v1 << 15) ^ v1 0x2882D802120E) s.add((v2 …

Linux_安装docker

安装包管理工具yum-utils&#xff0c;并设置docker储存库&#xff08;如果已有&#xff0c;不用安装&#xff09; # 安装包管理工具 sudo yum install -y yum-utils # 安装docker储存库 sudo yum-config-manager \--add-repo \http://mirrors.aliyun.com/docker-ce/linux/cen…

ERP管理系统为何成为制造业的必备工具

ERP管理系统为何成为制造业的必备工具&#xff1f; 全球化和数字化快速发展&#xff0c;制造业面临着越来越多的挑战和机遇。为了提高生产效率、降低成本、优化资源配置&#xff0c;许多制造业企业开始引入ERP管理系统。那么&#xff0c;为何ERP管理系统成为制造业的必备工具呢…

109. 有序链表转化为二叉搜索树

题目 题解 分治。 class Solution:def getMedian(self, left: ListNode, right: ListNode) -> ListNode:找到链表的中间节点slow fast leftwhile fast ! right and fast.next ! right:slow slow.nextfast fast.next.nextreturn slowdef buildTree(self, left: ListNod…

Python爬虫实战(进阶篇)—7获取每日菜价(附完整代码)

文章目录 专栏导读背景前期准备1、网址&#xff1a;2、分析&#xff1a; 请求url、请求方法、请求参数测试一个完整代码写入Excel视频展示不足&#xff1a;结尾 专栏导读 &#x1f525;&#x1f525;本文已收录于《Python基础篇爬虫》 &#x1f251;&#x1f251;本专栏专门针…

问题汇总20231103

文章目录 前言问题汇总1.所有操作系统在CPU层面上是不是都为时间片轮转的形式处理程序&#xff1f;只是任务调度的调度算法不同&#xff1f;那多线程的本质也是时间片吗&#xff1f;只不过很小&#xff1f;2.Mcu和mpu的本质区别3.下载HAL库步骤4.RAM,ROM,SRAM,SDRAM,DDR内存5.编…

Spring事务和事务的传播机制

目录 Spring中事务的实现 MySQL中的事务使用 Spring 编程式事务 TransactionTemplate 编程式事务 TransactionManager编程式事务 Spring声明式事务 Transactional 参数说明 事务因为程序异常捕获不会自动回滚的解决方案 Transactional 原理 Spring 事务隔离级别 Spring…

Apipost 推出IDEA插件一键生成API文档

今天给大家推荐一款IDEA插件&#xff1a;Apipost-Helper-2.0&#xff0c;写完代码IDEA内一键生成API文档&#xff0c;无需安装、打开任何其他软件&#xff1b;写完代码IDEA内一键调试&#xff0c;无需安装、打开任何其他软件&#xff1b;生成API目录树&#xff0c;双击即可快速…

单片机编程原则

多任务编程的概念 方式一&#xff1a;实时操作系统&#xff08;不建议新手使用&#xff09; 方式二 &#xff1a;裸机多任务模型 逻辑多任务的基本原理 把三个任务分别分为一个一个的片段 然后先执行任务一的第一个切片 执行第二个任务的第一个片段 执行第三个任务的第一个片…

How to design a database storage model for water network information system

How to design a database storage model for water network information system 1、领域划分2、基础域2.1、概述2.2、E-R图2.3、SQL脚本 1、领域划分 序号中文名称英文名称代号备注1基础域basea012资产域assertsa023监测域monitora034水权域quotaa045灌溉域irrigationa056排涝…

JVM bash:jmap:未找到命令 解决

如果我们在使用JVM的jmap命令时遇到了"bash: jmap: 未找到命令"的错误&#xff0c;这可能是因为jmap命令没有在系统的可执行路径中。 要解决这个问题&#xff0c;可以尝试以下几种方法&#xff1a; 1. 检查Java安装&#xff1a;确保您已正确安装了Java Development …

数字孪生技术能够为旅游业带来什么新变化?

随着科技的不断发展&#xff0c;数字孪生技术逐渐融入各个行业&#xff0c;为旅游业的高质量发展提供了新的动力和可能性。数字孪生&#xff0c;即对现实世界的精确数字建模&#xff0c;通过实时数据同步、模拟分析&#xff0c;为旅游业带来了诸多创新和改变。 在数字孪生的理…

ES Kibana 简介

ES & Kibana 简介 来源&#xff1a;微信公众号《鲜枣课堂》 1998年9月4日&#xff0c;Google公司在美国硅谷成立。正如大家所知&#xff0c;它是一家做搜索引擎起家的公司。 无独有偶&#xff0c;一位名叫Doug?Cutting的美国工程师&#xff0c;也迷上了搜索引擎。他做了…

3. hdfs概述与高可用原理

简述 HDFS&#xff08;Hadoop Distributed File System&#xff09;是一种Hadoop分布式文件系统&#xff0c;具备高度容错特性&#xff0c;支持高吞吐量数据访问&#xff0c;可以在处理海量数据&#xff08;TB或PB级别以上&#xff09;的同时最大可能的降低成本。 HDFS适用于…

0门槛!用ChatGPT只花1天批量生成300个爆火TikTok视频

目录 1 2让天下没有难做的开发和运维&#xff0c;DevOps终于有了专属大模型 3关于 DevOpsGPT 1 不露脸&#xff0c;不怕视频也能从TikTok赚到钱?在过去30天&#xff0c;有人通过这个方式预计至少获得了超过1万美金的广告分成收益。这些成功账号的共同特点是&#xff0c;所有…

探究多态的原理与实现:虚函数表、动态绑定与抽象类

文章目录 一、多态概念二、多态实现&#xff08;具体&#xff09;2.1 虚函数2.2 虚函数 重写2.3 override关键字 与 final关键字2.4 重载、重写&#xff08;覆盖&#xff09;、重定义&#xff08;隐藏&#xff09;的区别 三、抽象类3.1 概念3.2 实现继承 && 接口继承 四…

通过使用阿里云服务器,搭建Java程序的运行环境

&#x1f4da;&#x1f4da; &#x1f3c5;我是默&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; ​​ &#x1f31f;在这里&#xff0c;我要推荐给大家我的专栏《Linux》。&#x1f3af;&#x1f3af; &#x1f680;无论你是编程小白&#xff0c;还是有一…