gitlogo

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 addgit 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 添加,但不希望包含在下一提交快照中的缓存。

本笔记内容整理过程中参考黑马程序员视频课与菜鸟教程

 posted on 2023-04-17 18:26  Gosel  阅读(21)  评论(0编辑  收藏  举报