本地 git 的使用

ubuntu 安装 git

sudo apt install git

设置上传代码用户的标识(全程使用git_demo为例)

全局设置

$ git config --global user.name "name"
$ git config --global user.email "email@example.com"

单独为项目设置 git_demo设置用户名和邮箱

$ cd git_demo
$ git init    //将git_demo文件夹设为git项目,文件夹下出现.git文件夹用于控制项目
$ git config user.name "name"
$ git config user.email "email@example.com"

操作文件

现在我新建两个文件 demo01 demo02 ,并使用 git status 查看目前的状态。

ascrew@A11200421050195:~/workspace/personal/git_demo$ git status
位于分支 master

尚无提交

未跟踪的文件:
  (使用 "git add <文件>..." 以包含要提交的内容)
        demo01.txt
        demo02.txt

提交为空,但是存在尚未跟踪的文件(使用 "git add" 建立跟踪)

可以看到两个文件已经被git发现,但是目前还没有跟踪这两个文件,他们还不受版本控制,作任何修改也不会有记录。这是需要两个命令对它们进行操作。add 、commit

git add --all

add会把文件放到暂存区等待后续commit,可以理解add为把想要提交的文件和不打算提交又不打算还原的文件进行分离开来。

gascrew@A11200421050195:~/workspace/personal/git_demo$ git status
位于分支 master

尚无提交

未跟踪的文件:
  (使用 "git add <文件>..." 以包含要提交的内容)
        demo01.txt
        demo02.txt

提交为空,但是存在尚未跟踪的文件(使用 "git add" 建立跟踪)
git commit -m "your commit notes"

commit 后文件就被保留到git环境里了,可以使用 git log 查看提交记录,其总commit 后面一长串代码是本次提交的id,用于识别和还原代码等操作。

ascrew@A11200421050195:~/workspace/personal/git_demo$ git commit -m "第一次提交"
[master (根提交) 7ed30bf] 第一次提交
 2 files changed, 2 insertions(+)
 create mode 100644 demo01.txt
 create mode 100644 demo02.txt
ascrew@A11200421050195:~/workspace/personal/git_demo$ git status
位于分支 master
无文件要提交,干净的工作区
ascrew@A11200421050195:~/workspace/personal/git_demo$ git log
commit 7ed30bf2f44ebb2392a37b820adc1fa1458ec095 (HEAD -> master)
Author: Ascrew <1311585620@qq.com>
Date:   Wed Apr 21 17:11:13 2021 +0800

    第一次提交

在不同环境下add可能会出现下面的提示,这是因为不同操作系统下文件结尾的换行符不同,windows默认是CRLF(\r\n),Unix/Linux一般是LF(\n)。我当时是在windows下使用了git自带的bash终端进行了提交而出现了提示,之后一直使用ubuntu系统就没遇到过了。解决方法可以看这篇文章https://blog.csdn.net/feng88724/article/details/11600375

$ git add demo.py
warning: LF will be replaced by CRLF in demo.py.
The file will have its original line endings in your working directory
reset 还原

reset有三个选项分别是 hard soft mixed,不加参数默认是mixed模式。

  • hard 会重置缓存区和本地目录,让你完完全全回归到指定版本。所以在缓存区和本地文件已经改动的情况下,要小心使用hard,别把想留着的东西删除了。下面是例子。

    ascrew@A11200421050195:~/workspace/personal/git_demo$ cat demo01
    this is demo01.
    
    //最近一次提交版本号a034c16 (版本号一般记录前7位就足以定位一次记录)
    ascrew@A11200421050195:~/workspace/personal/git_demo$ git log
    commit a034c1611a84cf38b8ceea69fe0e674a06ad8946 (HEAD -> master)
    Author: Ascrew <1311585620@qq.com>
    Date:   Thu Apr 22 09:40:56 2021 +0800
    
        增加换行
    
    
    // modify demo01 and commit 
    ascrew@A11200421050195:~/workspace/personal/git_demo$ cat demo01
    this is demo01.
    add new content.
    
    //最近一次提交版本号变为 ddfdf8b
    ascrew@A11200421050195:~/workspace/personal/git_demo$ git log
    commit ddfdf8bc809fef77dba5d457c9c65fc384f221f9 (HEAD -> master)
    Author: Ascrew <1311585620@qq.com>
    Date:   Thu Apr 22 09:58:26 2021 +0800
    
        add new line
    
    commit a034c1611a84cf38b8ceea69fe0e674a06ad8946
    Author: Ascrew <1311585620@qq.com>
    Date:   Thu Apr 22 09:40:56 2021 +0800
    
        增加换行
    
    // 进行 hard 回退操作
    ascrew@A11200421050195:~/workspace/personal/git_demo$ git reset --hard HEAD^
    HEAD 现在位于 a034c16 增加换行
    ascrew@A11200421050195:~/workspace/personal/git_demo$ git log
    commit a034c1611a84cf38b8ceea69fe0e674a06ad8946 (HEAD -> master)
    Author: Ascrew <1311585620@qq.com>
    Date:   Thu Apr 22 09:40:56 2021 +0800
    
        增加换行
        
    ascrew@A11200421050195:~/workspace/personal/git_demo$ cat demo01
    this is demo01.
  • soft 会把目前到回退版本之间的修改的内容放回缓存区(如果你本地还有修改并且并未放入缓存区时进行了soft回退操作,本地目录的也会和缓存区一样被保留)。 使用soft的好处就是,你本地修改过的内容不会被擦除 。

    ascrew@A11200421050195:~/workspace/personal/git_demo$ cat demo01
    this is demo01.
    add new line second.
    ascrew@A11200421050195:~/workspace/personal/git_demo$ git add --all
    ascrew@A11200421050195:~/workspace/personal/git_demo$ git commit -m 'add new line second'
    [master fe5eec1] add new line second
     1 file changed, 1 insertion(+)
    ascrew@A11200421050195:~/workspace/personal/git_demo$ git log
    commit fe5eec1e25e18423b01ceee998e8f49e303ecb90 (HEAD -> master)
    Author: Ascrew <1311585620@qq.com>
    Date:   Thu Apr 22 10:05:05 2021 +0800
    
        add new line second
    
    commit a034c1611a84cf38b8ceea69fe0e674a06ad8946
    Author: Ascrew <1311585620@qq.com>
    Date:   Thu Apr 22 09:40:56 2021 +0800
    
        增加换行
        
    //使用 soft 回退
    ascrew@A11200421050195:~/workspace/personal/git_demo$ git status
    位于分支 master
    要提交的变更:
      (使用 "git restore --staged <文件>..." 以取消暂存)
            修改:     demo01
    
    ascrew@A11200421050195:~/workspace/personal/git_demo$ cat demo01
    this is demo01.
    add new line second.
  • mixed 根soft相似,区别是 mixed 会把修改过的全部内容放到本地目录,而暂存区是一点内容都没有的。

    ascrew@A11200421050195:~/workspace/personal/git_demo$ cat demo01
    this is demo01.
    add new line second.
    
    // 修改的demo01
    ascrew@A11200421050195:~/workspace/personal/git_demo$ cat demo01
    this is demo01.
    add new line second.
    add new line for test mixed.
    
    ascrew@A11200421050195:~/workspace/personal/git_demo$ git reset HEAD^
    重置后取消暂存的变更:
    M       demo01
    
    // 使用 mixed 回退
    ascrew@A11200421050195:~/workspace/personal/git_demo$ git status
    位于分支 master
    尚未暂存以备提交的变更:
      (使用 "git add <文件>..." 更新要提交的内容)
      (使用 "git restore <文件>..." 丢弃工作区的改动)
            修改:     demo01

关于版本参数可以有多种:

  • HEAD^ :表示上一个版本 (或者 HEAD~)
  • HEAD^^表示上上个版本
  • HEAD~100,为上100个版本 ( 或者打 HEAD 加上 100个 ^ )

github

github是一个云仓库,可以和本地双向传输。

github 与 开发机器绑定

首先要有一个github账户不多介绍。(我是ubuntu)在bash终端创建key,填入你在github的邮箱地址,后面一直Enter就行了。

 ssh-keygen -t rsa -C "youremail@example.com"

回车后,进入用户目录下 .ssh 文件夹,里面有 id_rsa 和 id_rsa.pub 文件这两个是SSH Key密钥对 id_rsa 是私钥,不要泄露。id_rsa.pub 是公钥,对外开放的。打开id_rsa.pub 复制里面的内容。登录github,打开 Account settingsSSH Keys and GPG keys 页面,点击 New SSH Key 填上任意Title,在 Key 文本框里粘贴id_rsa.pub文件的内容,Add Key之后就算是本地和github关联起来了,一个github账号可以关联多台机器,达到多人协同开发的目的。

项目关联

关联到github后还需要将本地项目对应到github账号上的项目,才能将本地代码提交到github或者从github更新本地代码。有两种情况进行绑定。(由于编写博客时网络原因无法登陆github,我使用gitee替代,他俩基本是一样的)

  • 情况一

    本地编写了一段时间的项目,想要放到gitee上继续维护。在gitee新建一个仓库与本地项目同名。之前我在本地新建git项目 git_demo,那么我也在gitee上新建一个git_demo然后将它俩关联起来,在bash中输入命令:

    git remote add origin https://gitee.com/zhgyu/git_demo.git
    git push -u origin master
    -u 参数是把本地分支master和远程gitee上的master分支关联,并且通过push讲本地代码推送到远程分支上。关联之后就不需要在加入 -u 参数了。
  • 情况二

    从别人的gitee上下载项目并共同维护(前提是你已经把id_rsa.pub 中的key绑定到他的gitee上)。

    git clone https://gitee.com/zhgyu/git_demo.git

    下载指定分支代码(远程分支名称 develop)

    git clone -b develop https://gitee.com/zhgyu/git_demo.git
    
    ascrew@A11200421050195:~/workspace/personal/git_demo$ git branch
    * develop
推动与获取远程代码
push

上传本地 commit后的代码到远程服务器,暂存区和本地目录修改的不做处理 。

git push
// 特殊情况 想要强行回退远程分支版本(小心使用)
git reset --hard 版本号
git push --force 
pull

从远程下载代码

git pull

分支

查看分支
// 查看本地分支
git branch
// 查看远程所有分支
git branch -r
// 查看本地和远程的分支
git branch -a
// 查看本地分支与远程分支的关联信息
git branch -vv
本地创建分支并切换
情况1 
// 先在本地建立分支
git checkout -b hotfix
// 推送当前分支并建立与远程上游的跟踪
git push --set-upstream origin hotfix
情况2
// 直接从远程下载某分支(本地分支可以换个别名)
git checkout -b <本地分支名称> origin/<远程分支名称>
// 远程已有分支dev,本地新建分支dev,想要将它俩关联
git branch --set-upstream-to=origin/<远程分支名称> <本地分支名称>
合并分支
// 切换到想要合并到的主要分支master
git checkout master
git pull
// 把开发分支 develop 合并过来,如果有冲突先解决冲突
git merge develop
git push
删除分支
// 删除本地分支
git branch -D 分支名称
// 删除远程分支
git push origin --delete 分钟名称

解决重复输入帐号密码

此命令会在config文件中记录你的帐号密码。

// 全局
git config --global credential.helper store
// 单独项目中
git config credential.helper store

.gitignore

git项目可以在跟目录添加.gitignore文件,保证一些配置文件不被上传到远程上。
有时候会出现一种情况,已经把配置文件上传到了远程,这时将此文件添加到.gitignore中并不会生效。需要做一下操作(比如配置文件是 config.json):

  1. 在 .gitignore 加入一行 config.json (写全路径)
  2. 执行以下代码

    git rm -r --chcahed config.json
    git add config.json
    git commit -m 'rm config.json with gitignore'
    git push

rebase

包含变基和改基的操作
学习文章 (https://blog.frankel.ch/inser...)

使用revert 和 reset 区别

遇到想要回退版本,并且想提交到远程的两种方法

  1. git revert commitId
    此操作会将commitId的版本代码去掉并提交一个新的版本,解决冲突后,使用git push 提交到远程,所以这是一种非常安全的回退方式。
  2. git reset --hard/mixed commitId
    此操作先会把本地代码直接回退到commitId版本,最新版本和commitId之间的版本会被重置,在使用git commit 和 git push -f 强行提交代码到远程,此时可能会完全删除一部分代码,不安全。

做最好的自己🌱
10 声望1 粉丝