git基本操作介绍

简介

本文会简单介绍git的基本操作。
这篇文章适合对git的安装、使用、运行环境、工作原理有一定了解的人员阅读;
对于初学者,可以先参考以下文章:
最新git安装教程

windows系统git安装教程

git入门教程,手把手教

git基本操作

git有哪些基本操作呢?可以在git bash上输入命令 git help查看各种情况下使用的常用Git命令。
如下图所示:

guest1@DESKTOP-zzc MINGW64 ~/Desktop
$ git help
usage: git [--version] [--help] [-C <path>] [-c <name>=<value>]
           [--exec-path[=<path>]] [--html-path] [--man-path] [--info-path]
           [-p | --paginate | -P | --no-pager] [--no-replace-objects] [--bare]
           [--git-dir=<path>] [--work-tree=<path>] [--namespace=<name>]
           [--super-prefix=<path>] [--config-env=<name>=<envvar>]
           <command> [<args>]

These are common Git commands used in various situations:

start a working area (see also: git help tutorial)
   clone     Clone a repository into a new directory
   init      Create an empty Git repository or reinitialize an existing one

work on the current change (see also: git help everyday)
   add       Add file contents to the index
   mv        Move or rename a file, a directory, or a symlink
   restore   Restore working tree files
   rm        Remove files from the working tree and from the index

examine the history and state (see also: git help revisions)
   bisect    Use binary search to find the commit that introduced a bug
   diff      Show changes between commits, commit and working tree, etc
   grep      Print lines matching a pattern
   log       Show commit logs
   show      Show various types of objects
   status    Show the working tree status

grow, mark and tweak your common history
   branch    List, create, or delete branches
   commit    Record changes to the repository
   merge     Join two or more development histories together
   rebase    Reapply commits on top of another base tip
   reset     Reset current HEAD to the specified state
   switch    Switch branches
   tag       Create, list, delete or verify a tag object signed with GPG

collaborate (see also: git help workflows)
   fetch     Download objects and refs from another repository
   pull      Fetch from and integrate with another repository or a local branch
   push      Update remote refs along with associated objects

也可以输入git help -a查看所有支持的git命令,这里不展开描述。

下面就让我们一一了解git的基本操作

开始一个工作区域

这里涉及到两个命令:clone和init,他们可以用来创建仓库。

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

命令 说明
git init 初始化仓库
git clone 拷贝一份远程仓库,也就是下载一个项目

git init命令

git init 命令用于在目录中创建新的 Git 仓库。
在目录中执行 git init 就可以创建一个 Git 仓库了。
例如我们在当前目录下创建一个名为 runoob 的项目:

$ mkdir test
$ cd test/
$ git init
#初始化空 Git 仓库完毕。

现在你可以看到在你的项目中生成了 .git 这个子目录,这就是你的 Git 仓库了,所有有关你的此项目的快照数据都存放在这里。
.git 默认是隐藏的,可以用 ls -a 命令查看:

$ ls -a
./  ../  .git/

git clone 命令

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

拷贝项目命令格式如下:

git clone [url]

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

例如我们拷贝 Github 上的项目

$ git clone https://github.com/lxyjrx/test1
Cloning into 'test1'...
remote: Enumerating objects: 53, done.
remote: Counting objects: 100% (38/38), done.
remote: Compressing objects: 100% (25/25), done.
remote: Total 53 (delta 11), reused 28 (delta 8), pack-reused 15
Receiving objects: 100% (53/53), 18.47 KiB | 1.42 MiB/s, done.
Resolving deltas: 100% (11/11), done.

拷贝完成后,在当前目录下会生成一个test1 目录:

guest1@DESKTOP-zzc MINGW64 /e/git project/test (master)
$ ls
test1/
guest1@DESKTOP-zzc MINGW64 /e/git project/test (master)
$ cd test1
guest1@DESKTOP-zzc MINGW64 /e/git project/test/test1 (master)
$ ls
1.c  example/  readme.txt  test1.txt

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

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

例如,以下实例拷贝远程 git 项目,本地项目名为 mytest:

guest1@DESKTOP-zzc MINGW64 /e/git project/test (master)
$ git clone https://github.com/lxyjrx/test1 mytest
Cloning into 'mytest'...
remote: Enumerating objects: 53, done.
remote: Counting objects: 100% (38/38), done.
remote: Compressing objects: 100% (25/25), done.
remote: Total 53 (delta 11), reused 28 (delta 8), pack-reused 15
Receiving objects: 100% (53/53), 18.47 KiB | 1.85 MiB/s, done.
Resolving deltas: 100% (11/11), done.

guest1@DESKTOP-zzc MINGW64 /e/git project/test (master)
$ ls -l
total 0
drwxr-xr-x 1 guest1 197609 0 Apr 26 18:17 mytest/
drwxr-xr-x 1 guest1 197609 0 Apr 26 18:11 test1/

从上面可以看到,本地多了一个mytest目录,里面有我们刚克隆的git仓库。

处理当前变化

这里涉及了4个命令:

*****将文件内容添加到暂存区*****
add       Add file contents to the index()
*****移动或重命名文件、目录或符号链接*****
mv        Move or rename a file, a directory, or a symlink
*****恢复工作树文件*****
restore   Restore working tree files
******从工作树和暂存区中删除文件****
rm        Remove files from the working tree and from the index

git add 命令

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

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

git add [file1] [file2] …

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

git add [dir]

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

git add .

以下实例我们添加两个文件(2.txt 3.txt):

guest1@DESKTOP-zzc MINGW64 /e/git project/test/mytest (master)
$ touch 2.txt 3.txt

guest1@DESKTOP-zzc MINGW64 /e/git project/test/mytest (master)
$ ls
1.c  2.txt  3.txt  example/  readme.txt  test1.txt

guest1@DESKTOP-zzc MINGW64 /e/git project/test/mytest (master)
$ git status -s
?? 2.txt
?? 3.txt

guest1@DESKTOP-zzc MINGW64 /e/git project/test/mytest (master)

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

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

git add 2.txt 3.txt

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

guest1@DESKTOP-zzc MINGW64 /e/git project/test/mytest (master)
$ git add 2.txt 3.txt

guest1@DESKTOP-zzc MINGW64 /e/git project/test/mytest (master)
$ git status -s
A  2.txt
A  3.txt

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

现在我们修改 2.txt文件:

$ vim 2.txt

在 2.txt 中添加以下内容:12345 ,然后保存退出。

再执行一下 git status:

guest1@DESKTOP-zzc MINGW64 /e/git project/test/mytest (master)
$ git status -s
AM 2.txt
A  3.txt

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

guest1@DESKTOP-zzc MINGW64 /e/git project/test/mytest (master)
$ git add .
warning: LF will be replaced by CRLF in 2.txt.
The file will have its original line endings in your working directory

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

git mv命令

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

git mv [file] [newfile]

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

git mv -f [file] [newfile]

示例如下:

$ git mv 2.txt 5.txt
guest1@DESKTOP-zzc MINGW64 /e/git project/test/mytest (master)
$ git mv 2.txt 5.txt

guest1@DESKTOP-zzc MINGW64 /e/git project/test/mytest (master)
$ ls
1.c  3.txt  5.txt  example/  readme.txt  test1.txt

git restore命令

下面通过一个示例来说明这个命令可以做什么。

用法1:

(1)先用git status看一下状态

guest1@DESKTOP-zzc MINGW64 /e/git project/test/mytest (master)
$ git status
On branch master
Your branch is up to date with 'origin/master'.

nothing to commit, working tree clean

(2)打开a.c添加点内容(原本内容是aaa)

guest1@DESKTOP-zzc MINGW64 /e/git project/test/mytest (master)
$ vim 1.c

guest1@DESKTOP-zzc MINGW64 /e/git project/test/mytest (master)
$ cat 1.c
aaaa1234

(3)再用git status看一下状态

guest1@DESKTOP-zzc MINGW64 /e/git project/test/mytest (master)
$ git status
On branch master
Your branch is ahead of 'origin/master' by 1 commit.
  (use "git push" to publish your local commits)

Changes not staged for commit:
  (use "git add ..." to update what will be committed)
  (use "git restore ..." to discard changes in working directory)
        modified:   1.c

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

此时a.c的状态是刚刚更改过,但是还没有用git add指令添加到暂存区中,也就是说a.c目前处于工作区下。

(4)使用git restore
也就是:git restore a.c

(5)再用git status看一下状态

guest1@DESKTOP-zzc MINGW64 /e/git project/test/mytest (master)
$ git status
On branch master
Your branch is ahead of 'origin/master' by 1 commit.
  (use "git push" to publish your local commits)

nothing to commit, working tree clean

(6)最后看一下1.c中的内容

guest1@DESKTOP-zzc MINGW64 /e/git project/test/mytest (master)
$ cat 1.c
aaaa

结论:git restore指令使得在工作区但是不在暂存区的文件撤销更改(内容恢复到没修改之前的状态)

用法2:

(1)先用git status看下状态,再用cat 1.c 看下1.c文件的内容

guest1@DESKTOP-zzc MINGW64 /e/git project/test/mytest (master)
$ cat 1.c
aaaa

(2)修改文件1.c内容并添加到暂存区,然后查看状态:

guest1@DESKTOP-zzc MINGW64 /e/git project/test/mytest (master)
$ vi 1.c

guest1@DESKTOP-zzc MINGW64 /e/git project/test/mytest (master)
$ git add 1.c

guest1@DESKTOP-zzc MINGW64 /e/git project/test/mytest (master)
$ 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 ..." to unstage)
        modified:   1.c

(5)使用git restore --staged

guest1@DESKTOP-zzc MINGW64 /e/git project/test/mytest (master)
$ git restore --staged 1.c

guest1@DESKTOP-zzc MINGW64 /e/git project/test/mytest (master)
$ cat 1.c
aaaa1234

可以看到使用git restore --staged之后,文件的内容并没有改变。

结论:git restore --staged的作用是将暂存区的文件从暂存区撤出,但不会更改文件的内容。

git rm 命令

git rm 命令用于删除文件。

如果只是简单地从工作目录中手工删除文件(如rm xxx),运行 git status 时就会有Changes not staged for commit 的提示。

git rm 删除文件有以下几种形式:

1、将文件从暂存区和工作区中删除:

git rm < file >

以下实例从暂存区和工作区中删除 1.c 文件:

git rm 1.c

如果删除之前修改过并且已经放到暂存区域的话,则必须要用强制删除选项 -f。

强行从暂存区和工作区中删除修改后的 1.c 文件:

git rm -f 1.c

如果想把文件从暂存区域移除,但仍然希望保留在当前工作目录中,换句话说,仅是从跟踪清单中删除,使用 --cached 选项即可:

git rm --cached < file >

以下实例从暂存区中删除 1.c 文件:

git rm --cached 1.c

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

git rm –r * 

检查历史和状态

这里会介绍几个命令:diff、grep、log、status。

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]
first-branch、second-branch是提交的版本号

git grep

这个命令可以在当前目录下查找指定的字符串。

guest1@DESKTOP-zzc MINGW64 /e/git project/test/mytest (master)
$ ls
1.c  example/  readme.txt  test1.txt

guest1@DESKTOP-zzc MINGW64 /e/git project/test/mytest (master)
$ git grep "aaaa"
1.c:aaaa1234

git log

Git 查看提交历史一般常用两个命令:
git log - 查看历史提交记录。
git blame - 以列表形式查看指定文件的历史修改记录。

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

guest1@DESKTOP-zzc MINGW64 /e/git project/test/mytest (master)
$ git log
commit 208a138177fffc76e98ee9fd5850d000b4b55dab (HEAD -> master)
Author: zzc <357341344@qq.com>
Date:   Tue Apr 26 19:03:06 2022 +0800

    修改文件内容为aaaa

commit 2ae95495c2d7f86995d83cc281f5ff31630ac968 (origin/master, origin/HEAD)
Author: zzc <357341344@qq.com>
Date:   Fri Apr 22 00:52:20 2022 +0800

    Update readme.txt

commit 74bd81bfefd6c37110ae1ba0c99346da24f1960c
Author: zzc <357341344@qq.com>
Date:   Fri Apr 22 00:49:48 2022 +0800

    删除不需要的文件2.txt

commit 5ae7b7506970e32da33275900561d770bffe98eb
Author: zzc <357341344@qq.com>
Date:   Fri Apr 22 00:37:00 2022 +0800

    Update p1.c

    添加代码注释

我们可以用 --oneline 选项来查看历史记录的简洁的版本。

guest1@DESKTOP-zzc MINGW64 /e/git project/test/mytest (master)
$ git log --oneline
208a138 (HEAD -> master) 修改文件内容为aaaa
2ae9549 (origin/master, origin/HEAD) Update readme.txt
74bd81b 删除不需要的文件2.txt
5ae7b75 Update p1.c
22732d4 新增linux进程相关示例代码
3642911 添加新文件2.txt
75b314e 添加文件1.c
f2f8da5 Delete test2.c

我们还可以用 --graph 选项,查看历史中什么时候出现了分支、合并。示例如下:

guest1@DESKTOP-zzc MINGW64 /e/git project/test/mytest (master)
$ git log --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
caa6afc 提交readme.txt文件
2ba0743 添加2222到readme.txt
80332f6 添加33333到readme.txt
ac066d6 添加新文件test1.txt
532c695 提交所有文件
9724dfc add file test2.c

如果只想查找指定用户的提交日志可以使用命令:git log --author , 例如,比方说我们要找 Git 源码中 zzc 提交的部分:

guest1@DESKTOP-zzc MINGW64 /e/git project/test/mytest (master)
$ git log --author=zzc --oneline -5
208a138 (HEAD -> master) 修改文件内容为aaaa
2ae9549 (origin/master, origin/HEAD) Update readme.txt
74bd81b 删除不需要的文件2.txt
5ae7b75 Update p1.c
22732d4 新增linux进程相关示例代码

如果你要指定日期,可以执行几个选项:–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 命令可查看:http://git-scm.com/docs/git-log

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

git blame < file >

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

guest1@DESKTOP-zzc MINGW64 /e/git project/test/mytest (master)
$ git blame readme.txt
2ae95495 (zzc 2022-04-22 00:52:20 +0800 1) example目录下存放的是示例代码。
2ae95495 (zzc 2022-04-22 00:52:20 +0800 2) 示例代码包括linux系统进程间通信示例代码及其他代码。

git status

git status 命令用于查看在你上次提交之后是否有对文件进行再次修改。
示例如下:

guest1@DESKTOP-zzc MINGW64 /e/git project/test/mytest (master)
$ 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 ..." to unstage)
        modified:   1.c

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

guest1@DESKTOP-zzc MINGW64 /e/git project/test/mytest (master)
$ git status -s
M  1.c

成长,标记和调整你的共同历史

这一部分会介绍branch、commit 、 merge、reset这几个命令。

git branch

创建分支命令:

git branch (branchname)

切换分支命令:

git checkout (branchname)

列出分支基本命令:

git branch

没有参数时,git branch 会列出你在本地的分支。

$ git branch
* master

上面的例子意思是,我们有一个叫做 master 的分支,并且该分支是当前分支。

当你执行 git init 的时候,默认情况下 Git 就会为你创建 master 分支。如果我们要手动创建一个分支。执行 git branch (branchname) 即可。

$ git branch testing
$ git branch
* master
  testing

现在我们可以看到,有了一个新分支 testing。
当你以此方式在上次提交更新之后创建了新分支,如果后来又有更新提交, 然后又切换到了 testing 分支,Git 将还原你的工作目录到你创建分支时候的样子。

接下来我们将演示如何切换分支,我们用 git checkout (branch) 切换到我们要修改的分支。

$ ls
README
$ echo 'runoob.com' > test.txt
$ git add .
$ git commit -m 'add test.txt'
[master 3e92c19] add test.txt
 1 file changed, 1 insertion(+)
 create mode 100644 test.txt
$ ls
README        test.txt
$ git checkout testing
Switched to branch 'testing'
$ ls
README

当我们切换到 testing 分支的时候,我们添加的新文件 test.txt 被移除了。切换回 master 分支的时候,它们又重新出现了。

$ git checkout master
Switched to branch 'master'
$ ls
README        test.txt

我们也可以使用 git checkout -b (branchname) 命令来创建新分支并立即切换到该分支下,从而在该分支中操作。

$ git checkout -b newtest
Switched to a new branch 'newtest'
$ git rm test.txt 
rm 'test.txt'
$ ls
README
$ touch runoob.php
$ git add .
$ git commit -am 'removed test.txt、add runoob.php'
[newtest c1501a2] removed test.txt、add runoob.php
 2 files changed, 1 deletion(-)
 create mode 100644 runoob.php
 delete mode 100644 test.txt
$ ls
README        runoob.php
$ git checkout master
Switched to branch 'master'
$ ls
README        test.txt

如你所见,我们创建了一个分支,在该分支上移除了一些文件 test.txt,并添加了 runoob.php 文件,然后切换回我们的主分支,删除的 test.txt 文件又回来了,且新增加的 runoob.php 不存在主分支中。
使用分支将工作切分开来,从而让我们能够在不同开发环境中做事,并来回切换。
总结一下:可能上面讲的有点拗口,简单理解就是每一个分支的内容都是独立的。

删除分支命令:

git branch -d (branchname)

git merge

分支合并
一旦某分支有了独立内容,你终究会希望将它合并回到你的主分支。 你可以使用以下命令将任何分支合并到当前分支中去:

git merge branch1
把分支branch1合并到当前分支

合并分支的时候如果出现冲突,那么我们可以手动修复冲突的内容,然后可以git add命令告诉 Git 文件冲突已经解决,最后重新提交即可。

合并完分支后我们可以删除分支,示例如下:

guest1@DESKTOP-zzc MINGW64 /e/git project/test2 (master)
$ git merge b1
Merge made by the 'ort' strategy.
 readme | 1 -
 1 file changed, 1 deletion(-)
 delete mode 100644 readme

guest1@DESKTOP-zzc MINGW64 /e/git project/test2 (master)
$ git branch
  b1
* master

guest1@DESKTOP-zzc MINGW64 /e/git project/test2 (master)
$ git branch -d b1
Deleted branch b1 (was 845c619).

guest1@DESKTOP-zzc MINGW64 /e/git project/test2 (master)
$ git branch
* master

git commit

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

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

git commit -m [message]
[message] 可以是一些备注信息。

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

git commit [file1] [file2] … -m [message]

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

$ git commit -a

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

$ git config --global user.name ‘zzc’
$ git config --global user.email [email protected]

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

想要快速提交,修改文件内容后直接输入以下命令即可:

$ git commit -am ‘修改 1.txt 文件’

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 命令可以用来撤销暂存区的改动。

总结一下:直接reset会把暂存区回退到指定版本,但工作区不受影响;加上soft暂存区不会回退,工作区也不受影响;如果带hard参数则会把暂存区和工作区都回退到指定版本,且此回退版本之后的提交信息会被删除。

合作、协作

这一部分有几个命令需要讲讲:remote、fetch、pull、push

git remote

git remote 命令用来操作远程仓库。

  • 显示所有远程仓库:
git remote -v
  • 显示某个远程仓库的信息:

git remote show [remote]

  • 连接 远程仓库

git remote add origin

origin是远程仓库本地名,REMOTE_URL是远程仓库的url

例子:

git remote add origin https://github.com/lxyjrx/temp1.git
git remote add origin [email protected]:lxyjrx/temp1.git
  • 切换远程仓库URL
git remote set-url origin [email protected]:lxyjrx/temp1.git
  • 移除一个远程仓库url
git remote rm origin	//origin是远程仓库名
  • 远程仓库在本地重命名

git remote rename old_name new_name

git fetch

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

git fetch是将远程主机的最新内容拉到本地,用户在检查了以后决定是否合并到工作本机分支中。

而git pull 则是将远程主机的最新内容拉下来后直接合并,即:git pull = git fetch + git merge,这样可能会产生冲突,需要手动解决。

git fetch 命令:

$ git fetch <远程主机名> //这个命令将某个远程主机的更新全部取回本地

如果只想取回特定分支的更新,可以指定分支名:

$ git fetch <远程主机名> <分支名> //注意之间有空格

最常见的命令如取回origin 主机的master 分支:

$ git fetch origin master

取回更新后,会返回一个FETCH_HEAD ,指的是某个branch在服务器上的最新状态,我们可以在本地通过它查看刚取回的更新信息:

$ git log -p FETCH_HEAD

如下图:
git基本操作介绍_第1张图片

可以看到返回的信息包括更新的文件名,更新的作者和时间,以及更新的代码(19行红色[删除]和绿色[新增]部分)。

我们可以通过这些信息来判断是否产生冲突,以确定是否将更新merge到当前分支。

git pull

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

git pull 其实就是 git fetch 和 git merge FETCH_HEAD 的简写。 命令格式如下:

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

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

git pull origin master:brantest

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

git pull origin 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
补充

1、如何避免每次pull或者push都要输入私钥口令?

方法1:直接修改私钥的口令,如下格式:

ssh-keygen -p [-P old_passphrase] [-N new_passphrase] [-f keyfile]

示例如下:

guest1@DESKTOP-zzc MINGW64 /e/git project/mytestgit (master)
$ ssh-keygen -p -P 123456 -N '' -f ~/.ssh/id_rsa
Key has comment '[email protected]'
Your identification has been saved with the new passphrase.

方法2:

ssh 推荐的登录方式是使用私钥登录。但是如果生成私钥的时候,设置了口令/密码(passphrase),每次登录时需要输入口令也很麻烦。可以通过 ssh-agent 来管理私钥,把私钥加载进内存,之后便不用再输入密码。

操作步骤如下:(该方法需要使用)

  1. 打git的bash命令,输入
	vi ~/.profile
  1. 键盘输入"i",插入以下的内容:
env=~/.ssh/agent.env
 
agent_load_env () { test -f "$env" && . "$env" >| /dev/null ; }

agent_start () {
 
    (umask 077; ssh-agent >| "$env")
 
    . "$env" >| /dev/null ; }
    
agent_load_env
 
# agent_run_state: 0=agent running w/ key; 1=agent w/o key; 2= agent not running
 
agent_run_state=$(ssh-add -l >| /dev/null 2>&1; echo $?)
if [ ! "$SSH_AUTH_SOCK" ] || [ $agent_run_state = 2 ]; then
    agent_start
    ssh-add
elif [ "$SSH_AUTH_SOCK" ] && [ $agent_run_state = 1 ]; then
    ssh-add
fi
unset env
  1. 按下“ESC”,在命令行下输入“:wq”。

经过实测,该方法只需要开机后输入一次口令,后面的操作都不需要再次输入。

2、如何避免每次pull或者push都要输入用户名和密码(https方式&&gitee)?

输入下面的命令,记住用户名和密码。

git config --global credential.helper store

总结

这篇文章适合那些对git的安装、使用和工作原理有过一定了解的人员阅读;
对于刚接触的朋友来说,需要先了解git、github相关的一些概念,可以参考以下文章:

最新git安装教程

windows系统git安装教程

git入门教程,手把手教

到这里为止,一些常用的git操作命令已经汇总完毕,一个一个验证也花了不少时间,对这些东西有了更深刻的印象和理解;如果以后忘记了怎么去使用,再回来看看吧。

好记性不如烂笔头。

你可能感兴趣的:(git,git)