Git剑客学习笔记-待完善

Git 学习

前言

一、Git基础

01|安装

安装成功后,打开powershell窗口, 检查 git 版本

PS C:\Users\lvzb3> git --version
git version 2.32.0.windows.1

02|最小配置

config的三个作用域 local、global、system

  • git config --local
  • git config --global
  • git config --system

其作用域的优先级 local > global > system, 上面加上 --list 就能列出具体信息

local的在.git/config里面;global的在个人home目录下的.gitconfig里面;system应该在git安装目录的下。

PS C:\Users\lvzb3> git config --list --local
fatal: --local can only be used inside a git repository
PS C:\Users\lvzb3>
PS C:\Users\lvzb3>
PS C:\Users\lvzb3> git config --list --global
user.name=lvzb31988
user.emal=lvzb31988@163.com
user.email=lvzb31988@163.com
PS C:\Users\lvzb3>
PS C:\Users\lvzb3>
PS C:\Users\lvzb3> git config --list --system
diff.astextplain.textconv=astextplain
filter.lfs.clean=git-lfs clean -- %f
filter.lfs.smudge=git-lfs smudge -- %f
filter.lfs.process=git-lfs filter-process
filter.lfs.required=true
http.sslbackend=openssl
http.sslcainfo=D:/Program Files/Git/mingw64/ssl/certs/ca-bundle.crt
core.autocrlf=true
core.fscache=true
core.symlinks=false
pull.rebase=false
credential.helper=manager-core
credential.https://dev.azure.com.usehttppath=true
init.defaultbranch=master

配置 user 信息,user.name 和 user.email 示例

  • git config --global user.name ‘lvzb31988’
  • git config --global user.email ‘lvzb31988@163.com‘

清除设置

  • git config --unset --local user.name
  • git config --unset --global user.name
  • git config --unset --system user.name
PS C:\Users\lvzb3> git config --global user.name 'lvzb31988'
PS C:\Users\lvzb3> git config --global user.email 'lvzb31988@163.com'
PS C:\Users\lvzb3> git config --global --list
user.name=lvzb31988
user.email=lvzb31988@163.com

03|创建git仓库设置local用户

两种⽅式:

  • ⽤ Git 之前已经有项⽬代码

    • cd 项⽬代码所在的⽂件夹
    • git init
  • ⽤ Git 之前还没有项⽬代码

    • cd 某个⽂件夹
    • git init your_project #会在当前路径下创建和项⽬名称同名的⽂件夹
    • cd your_project # your_project 里面会生成.git的隐藏文件
lvzb3@LAPTOP-3E5DGGO8 MINGW64 ~/Desktop/temp/git_learn (master)
$ git config --local user.name 'zlv11'

lvzb3@LAPTOP-3E5DGGO8 MINGW64 ~/Desktop/temp/git_learn (master)
$ git config --local user.email '1254863481@qq.com'

lvzb3@LAPTOP-3E5DGGO8 MINGW64 ~/Desktop/temp/git_learn (master)
$ git config --list
diff.astextplain.textconv=astextplain
filter.lfs.clean=git-lfs clean -- %f
filter.lfs.smudge=git-lfs smudge -- %f
filter.lfs.process=git-lfs filter-process
filter.lfs.required=true
http.sslbackend=openssl
http.sslcainfo=D:/Program Files/Git/mingw64/ssl/certs/ca-bundle.crt
core.autocrlf=true
core.fscache=true
core.symlinks=false
pull.rebase=false
credential.helper=manager-core
credential.https://dev.azure.com.usehttppath=true
init.defaultbranch=master
user.name=lvzb31988
user.email=lvzb31988@163.com
core.repositoryformatversion=0
core.filemode=false
core.bare=false
core.logallrefupdates=true
core.symlinks=false
core.ignorecase=true
user.name=zlv11
user.email=1254863481@qq.com

# git commit 后面不能指定文件
lvzb3@LAPTOP-3E5DGGO8 MINGW64 ~/Desktop/temp/git_learn (master)
$ git commit -m'commit a.txt' a.txt
error: pathspec 'a.txt' did not match any file(s) known to git

# git commit 不能直接提交没有 git add的文件
lvzb3@LAPTOP-3E5DGGO8 MINGW64 ~/Desktop/temp/git_learn (master)
$ git commit -m'commit a.txt'
On branch master

Initial commit

Untracked files:
  (use "git add <file>..." to include in what will be committed)
        a.txt

nothing added to commit but untracked files present (use "git add" to track)

lvzb3@LAPTOP-3E5DGGO8 MINGW64 ~/Desktop/temp/git_learn (master)
$ git add a.txt

lvzb3@LAPTOP-3E5DGGO8 MINGW64 ~/Desktop/temp/git_learn (master)
$ git commit -m'commit a.txt'
[master (root-commit) ca6eecb] commit a.txt
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 a.txt

lvzb3@LAPTOP-3E5DGGO8 MINGW64 ~/Desktop/temp/git_learn (master)
$ git status
On branch master
nothing to commit, working tree clean

# 这里使用git log 查看日志 前面已经设置好了 作用域时local级别的这里的 author 就是local基本的用户
# 由此可见 local级别作用域优先级大于global
lvzb3@LAPTOP-3E5DGGO8 MINGW64 ~/Desktop/temp/git_learn (master)
$ git log
commit ca6eecb11a9ed4a88f96f570975e7dcb5912e699 (HEAD -> master)
Author: zlv11 <1254863481@qq.com>
Date:   Fri Oct 7 23:19:41 2022 +0800

    commit a.txt

04|commit认识工作区和暂存区

工作区 通过 git add file1 到暂存区

暂存区 通过 git commit -m 'mess' 到 本地仓库

本地仓库

git add -u:将文件的修改、文件的删除,添加到暂存区。 # u update

git add .:将文件的修改,文件的新建,添加到暂存区。

git add -A:将文件的修改,文件的删除,文件的新建,添加到暂存区。

工作中一般是用到 git add . 或者 git add -A, 今天学习更进一步解了 git add -u 以及他们之间的区别,谢谢苏玲老师讲的很详细

git add -A 相对于git add -u命令的优点 : 可以提交所有被删除、被替换、被修改和新增的文件到数据暂存区,而

git add -u 只能操作跟踪过的文件 git add -A 等同于git add -all

用 -u 有个好处,避免把工作区没准备好的新文件直接加到暂存区了。

05|文件重命名

git mv sourceFileName targetFileName

git commit -m 'rename a.txt to b.txt'

$ git mv a.txt  b.txt

lvzb3@LAPTOP-3E5DGGO8 MINGW64 ~/Desktop/temp/git_learn (master)
$ git status
On branch master
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        renamed:    a.txt -> b.txt


lvzb3@LAPTOP-3E5DGGO8 MINGW64 ~/Desktop/temp/git_learn (master)
$ git commit -m 'rename a.txt to b.txt'
[master 51ecd33] rename a.txt to b.txt
 1 file changed, 0 insertions(+), 0 deletions(-)
 rename a.txt => b.txt (100%)

06|Git log 查看版本演变历史

git log #查看git 提交日志程度 只会查看当前分支下的提交日志 可以看 HEAD ——>指向看看当前属于哪个分支
git log --oneline #简洁查询git 提交的日志每次提交以一行展示,就是列出所有git日志,但只列出一条
git log -n4 #列出最近4条提交的git日志
git log -n4 --oneline #组合使用,简洁列出最近4条记录
git log --all #查看当前目录下所有分支的提交日志
git log --all --graph #查看当前目录下所有分支的提交日志,图形化的方式,会体体现父子关系
git log --oneline --all --graph -n4 # 组合使用,详情看上面各个小命令即可

git checkout -b temp 96e251cafb1a75937 #创建一个temp分支并且切换到该分支 96e251cafb1a75937是某个版本提交的唯一id
git branch -av #查看本地有多少分支 a查看远程分支

gitk #打开git的图形化界面git

git help --web log #跳转到git log 的帮助文档网页

其中: Linux上,-后面跟一个字符,如-a,-b;–后面跟的是字符串,如–version,–all

07|gitk: 图形话界面查看版本历史

08| 探秘.git目录

09|commit、tree 和blob三个对象之间的关系

10|数一数tree的个数

11|分离头指针情况下的注意事项

12|进一步理解HEAD和branch

二、独自使用Git的常见场景

01|删除不要的分支

注意在当年分支下无法删除当前分支,新手很容易犯这个错误

删除分支先用 -d 检查是否能够删除,如果不能删除则更具具体情况做处理,如果要强制删除 用-D

git branch -d feature/add_git_commands # 删除分支 feature/add_git_commands

git branch -D feature/add_git_commands # 强制删除 分支feature/add_git_commands

git branch -d feature/add_git_commands

02|如何修改最新的commit的message?

有时候commit后,感觉message 描述的不是很符合,或者存在错别字,需要修改最近一次的提交的描述

git commit --amend, 进入后,就进入linux 的 vim编辑模式,编辑第一行的messag 即可

lvzb3@LAPTOP-3E5DGGO8 MINGW64 /d/IdeaProjects/java11/demo/git_learn (master)
$ git log --oneline -n4
54e2eaf (HEAD -> master) 第一次提交
d61376e (origin/master) 本地文件再次提交
50fa4a0 fix pom.xml
15d06f4 update pom.xml fix file 1111

lvzb3@LAPTOP-3E5DGGO8 MINGW64 /d/IdeaProjects/java11/demo/git_learn (master)
$ git commit --amend
[master addc99c] 第一次提交,来进行修改提交的描述
 Date: Wed Aug 3 19:14:40 2022 +0800
 10 files changed, 2185 insertions(+), 2 deletions(-)
 rewrite atlas-demo/src/test/java/com/atlas/demo/AtlasHttpClientPostTest.java (96%)
 create mode 100644 atlas-demo/src/test/java/com/atlas/demo/matedata/JdbcUtil.java
 create mode 100644 atlas-demo/src/test/java/com/atlas/demo/matedata/MeteDataTest.java
 create mode 100644 atlas-demo/src/test/java/com/atlas/demo/matedata/RdbmsBridge.java
 create mode 100644 atlas-demo/src/test/java/com/atlas/demo/model/RdbmsDataTypes.java
 create mode 100644 atlas-demo/src/test/java/com/atlas/demo/model/RdbmsServerTypes.java
 create mode 100644 java-base/src/test/java/com/base/demo/thread/SingleTest.java
 create mode 100644 java-base/src/test/java/com/base/demo/util/UrlTest.java
 create mode 100644 redisson-demo/src/main/java/com/redisson/demo/config/RedisConfig.java
 create mode 100644 redisson-demo/src/test/java/com/redisson/demo/config/RedisConfigTest.java

lvzb3@LAPTOP-3E5DGGO8 MINGW64 /d/IdeaProjects/java11/demo/git_learn (master)
$ git log --oneline -1
addc99c (HEAD -> master) 第一次提交,来进行修改提交的描述

03|如何修改老旧的commit的message?

git rebase -i 50fa4a0f858ee57940fd55cc67296fc9 该命令用于修改老旧的 commit的命令,注意只能修改本地未提交到远程仓库的时候修改,已经提交到远程的原则上不允许修改。-i 后面的hashid则是基于你要修改的那次commit的父一级的commit hash

lvzb3@LAPTOP-3E5DGGO8 MINGW64 /d/IdeaProjects/java11/demo/git_learn (master)
$ git log -3
commit addc99ccd6dd285910181cc76ab9f445c495e666 (HEAD -> master)
Author: lvzb31988 <lvzb31988@163.com>
Date:   Wed Aug 3 19:14:40 2022 +0800

    第一次提交,来进行修改提交的描述

commit d61376efcbef4be5ae071d86dd30743bc038c63a (origin/master)
Author: lvzb31988 <lvzb31988@163.com>
Date:   Thu Jul 28 21:56:23 2022 +0800

    本地文件再次提交

commit 50fa4a0f858ee57940fd55cc67296fc9d1515c29
Author: lvzb31988 <lvzb31988@163.com>
Date:   Thu Jul 28 21:29:04 2022 +0800

    fix pom.xml

lvzb3@LAPTOP-3E5DGGO8 MINGW64 /d/IdeaProjects/java11/demo/git_learn (master)
$ git rebase -i 50fa4a0f858ee57940fd55cc67296fc9
error: cannot rebase: You have unstaged changes.
error: Please commit or stash them.

04|如何合并前几次commit为一个commit?

git rebase -i d61376e 注意只能修改本地未提交到远程仓库的时候修改,已经提交到远程的原则上不允许修改。-i 后面的hashid则是基于你要修改的那次commit的父一级的commit hash.这里要合并 addc99c、cea96c3、091ec85、e88010c几个commit 为一个,因此基于 d61376e。进入之后,留下他是 pick,其余的选择 s 然后保存,弹出第二个框时添加一行message 即可

$ git log --oneline
e88010c (HEAD -> master) commit three
091ec85 commit two
cea96c3 commit merg one,two,three
addc99c 第一次提交,来进行修改提交的描述
d61376e (origin/master) 本地文件再次提交
50fa4a0 fix pom.xml

lvzb3@LAPTOP-3E5DGGO8 MINGW64 /d/IdeaProjects/java11/demo/git_learn (master)
$ git rebase -i d61376e
[detached HEAD 0624379] merge one,two,three commit
 Date: Wed Aug 3 19:14:40 2022 +0800
 18 files changed, 3454 insertions(+), 986 deletions(-)
 rewrite atlas-demo/src/test/java/com/atlas/demo/AtlasHttpClientPostTest.java (96%)
 create mode 100644 atlas-demo/src/test/java/com/atlas/demo/matedata/JdbcUtil.java
 create mode 100644 atlas-demo/src/test/java/com/atlas/demo/matedata/MeteDataTest.java
 create mode 100644 atlas-demo/src/test/java/com/atlas/demo/matedata/RdbmsBridge.java
 create mode 100644 atlas-demo/src/test/java/com/atlas/demo/model/RdbmsDataTypes.java
 create mode 100644 atlas-demo/src/test/java/com/atlas/demo/model/RdbmsServerTypes.java
 rewrite docs/js/docsify-edit-on-github-index.js (98%)
 rewrite docs/js/prism-java.js (99%)
 rewrite docs/js/zoom-image.js (97%)
 create mode 100644 java-base/src/test/java/com/base/demo/thread/SingleTest.java
 rewrite java-base/src/test/java/com/base/demo/util/ToolsTest.java (67%)
 create mode 100644 java-base/src/test/java/com/base/demo/util/UrlTest.java
 rewrite java-base/src/test/java/com/base/demo/util/UsefulFunctionsTest.java (63%)
 create mode 100644 redisson-demo/src/main/java/com/redisson/demo/config/RedisConfig.java
 create mode 100644 redisson-demo/src/test/java/com/redisson/demo/config/RedisConfigTest.java
Successfully rebased and updated refs/heads/master.

lvzb3@LAPTOP-3E5DGGO8 MINGW64 /d/IdeaProjects/java11/demo/git_learn (master)
$ git log --oneline
0624379 (HEAD -> master) merge one,two,three commit
d61376e (origin/master) 本地文件再次提交
50fa4a0 fix pom.xml

05|怎么样把间隔的几个commit 合并成一个?

git rebase -i hash 还是使用该commit,进去后,要合并的几挑出来移动下顺序紧凑放一起,然后参数使用 s 即可。如果是根节点开始的话,需要开头补上 pick (根节点的hash),此时合并后,会有个断层的树,因为合并会修改hash值。正常现象

06|怎么比较暂存区和HEAD所含文件的差异?

git diff --cache , 该命令用于查看 暂存区和当前HEAD所指向的文件的差异。注意 修改后的文件 只有 git add 后才能进入暂存区,而不是一修改就进入暂存区。因此命令行模式修改后,一定是 add 然后 commit。

lvzb3@LAPTOP-3E5DGGO8 MINGW64 /d/IdeaProjects/java11/demo/git_learn (master)
$ git diff --cached bbb.txt
diff --git a/git_learn/bbb.txt b/git_learn/bbb.txt
index 26c484c..0cb9e30 100644
--- a/git_learn/bbb.txt
+++ b/git_learn/bbb.txt
@@ -1 +1,3 @@
-sdfaf
\ No newline at end of file
+sdfaf
+
+add one line

07|怎么比较工作区和暂存区所含文件的差异?

git diff 命令比所有较工作区和暂存区的文件差异,可以指定多个文件 git diff --bbb.txt aaa.txt

$ git diff -- aaa.txt bbb.txt
warning: LF will be replaced by CRLF in git_learn/aaa.txt.
The file will have its original line endings in your working directory
warning: LF will be replaced by CRLF in git_learn/bbb.txt.
The file will have its original line endings in your working directory
diff --git a/git_learn/aaa.txt b/git_learn/aaa.txt
index 429b530..e140acc 100644
--- a/git_learn/aaa.txt
+++ b/git_learn/aaa.txt
@@ -1 +1 @@
-add one line
+add one line 111
diff --git a/git_learn/bbb.txt b/git_learn/bbb.txt
index 26c484c..0cb9e30 100644
--- a/git_learn/bbb.txt
+++ b/git_learn/bbb.txt
@@ -1 +1,3 @@
-sdfaf
\ No newline at end of file
+sdfaf
+
+add one line

08|如何让暂存区全部恢复到和HEAD一致?

git reset HEAD,[如果文件是新增的,刚刚 add了,然后通过该命令就能回到未被git管理的状态]

git reset 有三个参数

  • –soft 这个只是把 HEAD 指向的 commit 恢复到你指定的 commit,暂存区 工作区不变
  • –hard 这个是 把 HEAD, 暂存区, 工作区 都修改为 你指定的 commit 的时候的文件状态
  • –mixed 这个是不加时候的默认参数,把 HEAD,暂存区 修改为 你指定的 commit 的时候的文件状态,工作区保持不变
  • git reset HEAD 等价于 git reset --mixed HEAD,把暂存区恢复成和HEAD一样。

09|如何让工作区的文件恢复到暂存区一致?

git checkout -- bbb.txt 该命令可以使得工作区的文件内容恢复到和暂存区一致。

lvzb3@LAPTOP-3E5DGGO8 MINGW64 /d/IdeaProjects/java11/demo/git_learn (master)
$ git diff
warning: LF will be replaced by CRLF in git_learn/bbb.txt.
The file will have its original line endings in your working directory
diff --git a/git_learn/bbb.txt b/git_learn/bbb.txt
index 26c484c..fbbfeb8 100644
--- a/git_learn/bbb.txt
+++ b/git_learn/bbb.txt
@@ -1 +1,2 @@
-sdfaf
\ No newline at end of file
+sdfaf
+778889
\ No newline at end of file

lvzb3@LAPTOP-3E5DGGO8 MINGW64 /d/IdeaProjects/java11/demo/git_learn (master)
$ git checkout -- bbb.txt

lvzb3@LAPTOP-3E5DGGO8 MINGW64 /d/IdeaProjects/java11/demo/git_learn (master)
$ git diff

10|怎样取消暂存区部分文件的更改到HEAD?

git reset HEAD -- a.txt b.txt, 让文件从暂存区恢复到和HEAD一致是使用 reset.

  • 开始使用 git diff bbb.txt文件的工作区和暂存区有不同,新增了 一行789456,此时bbb.txt 暂存区没有改动。
  • 当把bbb.txt文件添加到暂存区后,使用git diff --cached bbb.txt 查看,有所变更
  • 然后使用 git reset HEAD – bbb.txt 将暂存区恢复到和HEAD指针所指的文件一样。
  • 再使用 git diff --cached bbb.txt就查看不到变更
lvzb3@LAPTOP-3E5DGGO8 MINGW64 /d/IdeaProjects/java11/demo/git_learn (master)
$ git diff
warning: LF will be replaced by CRLF in git_learn/bbb.txt.
The file will have its original line endings in your working directory
diff --git a/git_learn/bbb.txt b/git_learn/bbb.txt
index 26c484c..8ae0592 100644
--- a/git_learn/bbb.txt
+++ b/git_learn/bbb.txt
@@ -1 +1,2 @@
-sdfaf
\ No newline at end of file
+sdfaf
+789456
\ No newline at end of file

lvzb3@LAPTOP-3E5DGGO8 MINGW64 /d/IdeaProjects/java11/demo/git_learn (master)
$ git diff --cached bbb.txt

lvzb3@LAPTOP-3E5DGGO8 MINGW64 /d/IdeaProjects/java11/demo/git_learn (master)
$ git add bbb.txt
warning: LF will be replaced by CRLF in git_learn/bbb.txt.
The file will have its original line endings in your working directory

lvzb3@LAPTOP-3E5DGGO8 MINGW64 /d/IdeaProjects/java11/demo/git_learn (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 <file>..." to unstage)
        new file:   aaa.txt
        modified:   bbb.txt

Untracked files:
  (use "git add <file>..." to include in what will be committed)
        ../atlas-demo/.gitignore
        ../atlas-demo/README.md
        ../atlas-demo/pom.xml


lvzb3@LAPTOP-3E5DGGO8 MINGW64 /d/IdeaProjects/java11/demo/git_learn (master)
$ git diff --cached bbb.txt
diff --git a/git_learn/bbb.txt b/git_learn/bbb.txt
index 26c484c..8ae0592 100644
--- a/git_learn/bbb.txt
+++ b/git_learn/bbb.txt
@@ -1 +1,2 @@
-sdfaf
\ No newline at end of file
+sdfaf
+789456
\ No newline at end of file

lvzb3@LAPTOP-3E5DGGO8 MINGW64 /d/IdeaProjects/java11/demo/git_learn (master)
$ git reset HEAD -- bbb.txt
Unstaged changes after reset:
M       git_learn/bbb.txt

lvzb3@LAPTOP-3E5DGGO8 MINGW64 /d/IdeaProjects/java11/demo/git_learn (master)
$ git diff --cached
diff --git a/git_learn/aaa.txt b/git_learn/aaa.txt
new file mode 100644
index 0000000..e140acc
--- /dev/null
+++ b/git_learn/aaa.txt
@@ -0,0 +1 @@
+add one line 111

lvzb3@LAPTOP-3E5DGGO8 MINGW64 /d/IdeaProjects/java11/demo/git_learn (master)
$ git diff --cached bbb.txt

lvzb3@LAPTOP-3E5DGGO8 MINGW64 /d/IdeaProjects/java11/demo/git_learn (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 <file>..." to unstage)
        new file:   aaa.txt

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
        modified:   bbb.txt

Untracked files:
  (use "git add <file>..." to include in what will be committed)
        ../atlas-demo/.gitignore
        ../atlas-demo/README.md
        ../atlas-demo/pom.xml


11|消除最近几次的commit

git reset --hard XXXX 回退版本到某个节点。这里先添加一个 bbb1.txt文件给git管理,然后修改提交2次到本地仓库,然后再使用 git reset --hard 回退版本到提交2次之前的状态。(回退指 工作区和暂存区都回到该节点的工作区和暂存区),使用 git reset --hard HEAD 使得 工作区和暂存区都恢复到 HEAD 所指版本

lvzb3@LAPTOP-3E5DGGO8 MINGW64 /d/IdeaProjects/java11/demo/git_learn (master)
$ git commit -m 'bbb1.txt add Head first 设计模式'
[master 68beda1] bbb1.txt add Head first 设计模式
 1 file changed, 3 insertions(+), 1 deletion(-)

lvzb3@LAPTOP-3E5DGGO8 MINGW64 /d/IdeaProjects/java11/demo/git_learn (master)
$ git log -4 --oneline
68beda1 (HEAD -> master) bbb1.txt add Head first 设计模式
d8fd5ad add bbb1.txt
c2dfd9e 提交一次
0624379 merge one,two,three commit

lvzb3@LAPTOP-3E5DGGO8 MINGW64 /d/IdeaProjects/java11/demo/git_learn (master)
$ git add -u

lvzb3@LAPTOP-3E5DGGO8 MINGW64 /d/IdeaProjects/java11/demo/git_learn (master)
$ git commit -m 'bbb1.txt delete three line'
[master 5df5083] bbb1.txt delete three line
 1 file changed, 1 deletion(-)

lvzb3@LAPTOP-3E5DGGO8 MINGW64 /d/IdeaProjects/java11/demo/git_learn (master)
$ git log -4 --oneline
5df5083 (HEAD -> master) bbb1.txt delete three line
68beda1 bbb1.txt add Head first 设计模式
d8fd5ad add bbb1.txt
c2dfd9e 提交一次

lvzb3@LAPTOP-3E5DGGO8 MINGW64 /d/IdeaProjects/java11/demo/git_learn (master)
$ git reset --hard d8fd5ad
HEAD is now at d8fd5ad add bbb1.txt

lvzb3@LAPTOP-3E5DGGO8 MINGW64 /d/IdeaProjects/java11/demo/git_learn (master)
$ git log -4 --oneline
d8fd5ad (HEAD -> master) add bbb1.txt
c2dfd9e 提交一次
0624379 merge one,two,three commit
d61376e (origin/master) 本地文件再次提交

12|查看不同提交的文件差异

git diff master temp -- file1 可以把 master 和 temp 换成每次提交的 hash id 进行比较。 不加任何参数 默认比较所有文件的差异 – 后可以指定一个或多个文件的差异

lvzb3@LAPTOP-3E5DGGO8 MINGW64 /d/IdeaProjects/java11/demo/git_learn (master)
$ git commit -m 'bbb1.txt add Head First'
[master 9c104f7] bbb1.txt add Head First
 1 file changed, 1 insertion(+), 1 deletion(-)

lvzb3@LAPTOP-3E5DGGO8 MINGW64 /d/IdeaProjects/java11/demo/git_learn (master)
$ git log --oneline -4
9c104f7 (HEAD -> master) bbb1.txt add Head First
d8fd5ad add bbb1.txt
c2dfd9e 提交一次
0624379 merge one,two,three commit

lvzb3@LAPTOP-3E5DGGO8 MINGW64 /d/IdeaProjects/java11/demo/git_learn (master)
$ git diff d8fd5ad 9c104f7 -- bbb1.txt
diff --git a/git_learn/bbb1.txt b/git_learn/bbb1.txt
index 305a3e1..485c227 100644
--- a/git_learn/bbb1.txt
+++ b/git_learn/bbb1.txt
@@ -1,4 +1,4 @@
-1111111 22
+1111111 22 Head First
 2222222 33
 4444444 55
 8974542132
\ No newline at end of file

13|正确删除文件的方法

git rm fileName 该命令用于删除工作区暂存区里的文件,commit 提交后该文件就会从版本里删除。

lvzb3@LAPTOP-3E5DGGO8 MINGW64 /d/IdeaProjects/java11/demo/git_learn (master)
$ git commit -m 'add add'
[master 90dc095] add add
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 git_learn/add

lvzb3@LAPTOP-3E5DGGO8 MINGW64 /d/IdeaProjects/java11/demo/git_learn (master)
$ git rm add
rm 'git_learn/add'

lvzb3@LAPTOP-3E5DGGO8 MINGW64 /d/IdeaProjects/java11/demo/git_learn (master)
$ git status
On branch master
Your branch is ahead of 'origin/master' by 5 commits.
  (use "git push" to publish your local commits)

Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        deleted:    add

Untracked files:
  (use "git add <file>..." to include in what will be committed)
        ../atlas-demo/.gitignore
        ../atlas-demo/README.md
        ../atlas-demo/pom.xml


lvzb3@LAPTOP-3E5DGGO8 MINGW64 /d/IdeaProjects/java11/demo/git_learn (master)
$ git commit  -m 'delete add file'
[master 76db616] delete add file
 1 file changed, 0 insertions(+), 0 deletions(-)
 delete mode 100644 git_learn/add

14|开发中加塞了紧急任务

git stash list: 查看当前工作区的堆栈

git stash apply: 从工作区的堆栈中取出栈顶的内容,不弹栈

git stash pop: 从工区的堆栈中取出栈顶内容,弹栈

git stash: 保存工作区的内容到 栈中,修改后的文件就恢复到了和HEAD一致,可以用来处理紧急任务,提交后再恢复到弹栈的内容,恢复后可能存在文件的冲突,需要处理冲突,也可以使用 git reset HEAD --hard 恢复到当前HEAD指向的版本区域

$ git stash
Saved working directory and index state WIP on master: f2de2d8 update aaa.txt bbb1.txt

lvzb3@LAPTOP-3E5DGGO8 MINGW64 /d/IdeaProjects/java11/demo/git_learn (master)
$ git stash list
stash@{0}: WIP on master: f2de2d8 update aaa.txt bbb1.txt
stash@{1}: WIP on master: b6784f5 master222

lvzb3@LAPTOP-3E5DGGO8 MINGW64 /d/IdeaProjects/java11/demo/git_learn (master)
$ git add -u

lvzb3@LAPTOP-3E5DGGO8 MINGW64 /d/IdeaProjects/java11/demo/git_learn (master)
$ git commit -m 'aaaa'
[master 24bb23a] aaaa
 2 files changed, 9 insertions(+), 2 deletions(-)

lvzb3@LAPTOP-3E5DGGO8 MINGW64 /d/IdeaProjects/java11/demo/git_learn (master)
$ git stash pop
Auto-merging git_learn/bbb1.txt
CONFLICT (content): Merge conflict in git_learn/bbb1.txt
Auto-merging git_learn/bbb.txt
CONFLICT (content): Merge conflict in git_learn/bbb.txt
The stash entry is kept in case you need it again.

lvzb3@LAPTOP-3E5DGGO8 MINGW64 /d/IdeaProjects/java11/demo/git_learn (master)
$ git reset HEAD --hard
HEAD is now at 24bb23a aaaa

15|如何指定不需要Git管理的文件

添加 .gitignore文件即可

bin/: 忽略当前路径下的bin文件夹,该文件夹下的所有内容都会被忽略,不忽略 bin 文件
/bin: 忽略根目录下的bin文件
/*.c: 忽略 cat.c,不忽略 build/cat.c
debug/*.obj: 忽略 debug/io.obj,不忽略 debug/common/io.obj 和 tools/debug/io.obj
**/foo: 忽略/foo, a/foo, a/b/foo等
a/**/b: 忽略a/b, a/x/b, a/x/y/b等
!/bin/run.sh: 不忽略 bin 目录下的 run.sh 文件
*.log: 忽略所有 .log 文件
config.php: 忽略当前路径的 config.php 文件

### .gitignore规则不生效
.gitignore只能忽略那些原来没有被track的文件,如果某些文件已经被纳入了版本管理中,则修改.gitignore是无效的。

解决方法就是先把本地缓存删除(改变成未track状态),然后再提交:
git rm -r --cached .
git add .
git commit -m 'update .gitignore'

### 你想添加一个文件到Git,但发现添加不了,原因是这个文件被.gitignore忽略了:
$ git add App.class
The following paths are ignored by one of your .gitignore files:
App.class
Use -f if you really want to add them.

如果你确实想添加该文件,可以用-f强制添加到Git:
$ git add -f App.class

或者你发现,可能是.gitignore写得有问题,需要找出来到底哪个规则写错了,可以用git check-ignore命令检查:
$ git check-ignore -v App.class
.gitignore:3:*.class    App.class

Git会告诉我们,.gitignore的第3行规则忽略了该文件,于是我们就可以知道应该修订哪个规则。

16|如何将git仓库备份到本地

git clone --bare file:///d/IdeaProjects/java11/demo/.git zhineng.git : --bare 克隆一个不带工作区的git file:///是文件协议, 可以替换成Http,https, ssh等只能协议。也有哑协议。

lvzb3@LAPTOP-3E5DGGO8 MINGW64 /d/temp
$ pwd
/d/temp

lvzb3@LAPTOP-3E5DGGO8 MINGW64 /d/temp
$ git clone --bare file:///d/IdeaProjects/java11/demo/.git zhineng.git
Cloning into bare repository 'zhineng.git'...
remote: Enumerating objects: 297, done.
remote: Counting objects: 100% (297/297), done.
remote: Compressing objects: 100% (229/229), done.
remote: Total 297 (delta 85), reused 0 (delta 0), pack-reused 0
Receiving objects: 100% (297/297), 1.40 MiB | 8.08 MiB/s, done.
Resolving deltas: 100% (85/85), done.

lvzb3@LAPTOP-3E5DGGO8 MINGW64 /d/temp
$ ls
zhineng.git/

lvzb3@LAPTOP-3E5DGGO8 MINGW64 /d/temp
$ cd zhineng.git/

lvzb3@LAPTOP-3E5DGGO8 MINGW64 /d/temp/zhineng.git (BARE:master)
$ ls
HEAD  config  description  hooks/  info/  objects/  packed-refs  refs/

lvzb3@LAPTOP-3E5DGGO8 MINGW64 /d/temp/zhineng.git (BARE:master)
$ git branch -av
* master 52ab41e add readme.md
  temp   f5403cd 添加分支操作命令

这里演示了 本地maste分支,和备份分支 进行一个远程关联,然后master分支推送到备份分支的场景,推送后,master分支里查看分支时远程分支就多了一个 备份分支。

lvzb3@LAPTOP-3E5DGGO8 MINGW64 /d/IdeaProjects/java11/demo/git_learn (master)
$ git branch -av
* master                78a2ac4 [ahead 1] update One line
  temp                  f5403cd 添加分支操作命令
  remotes/origin/master 52ab41e add readme.md
  remotes/origin/temp   f5403cd 添加分支操作命令

lvzb3@LAPTOP-3E5DGGO8 MINGW64 /d/IdeaProjects/java11/demo/git_learn (master)
$ git checkout -b local/test_master origin/master
Switched to a new branch 'local/test_master'
Branch 'local/test_master' set up to track remote branch 'master' from 'origin'.

lvzb3@LAPTOP-3E5DGGO8 MINGW64 /d/IdeaProjects/java11/demo/git_learn (local/test_master)
$ git checkout master
Switched to branch 'master'
Your branch is ahead of 'origin/master' by 1 commit.
  (use "git push" to publish your local commits)

lvzb3@LAPTOP-3E5DGGO8 MINGW64 /d/IdeaProjects/java11/demo/git_learn (master)
$ git branch -av
  local/test_master     52ab41e add readme.md
* master                78a2ac4 [ahead 1] update One line
  temp                  f5403cd 添加分支操作命令
  remotes/origin/master 52ab41e add readme.md
  remotes/origin/temp   f5403cd 添加分支操作命令

lvzb3@LAPTOP-3E5DGGO8 MINGW64 /d/IdeaProjects/java11/demo/git_learn (master)
$ git remote -v
origin  git@gitee.com:lvqifeng/study-demo.git (fetch)
origin  git@gitee.com:lvqifeng/study-demo.git (push)

lvzb3@LAPTOP-3E5DGGO8 MINGW64 /d/IdeaProjects/java11/demo/git_learn (master)
$ git remote add zhineng1 file:///d/temp/zhineng.git

lvzb3@LAPTOP-3E5DGGO8 MINGW64 /d/IdeaProjects/java11/demo/git_learn (master)
$ git branch -av
  local/test_master     52ab41e add readme.md
* master                78a2ac4 [ahead 1] update One line
  temp                  f5403cd 添加分支操作命令
  remotes/origin/master 52ab41e add readme.md
  remotes/origin/temp   f5403cd 添加分支操作命令

lvzb3@LAPTOP-3E5DGGO8 MINGW64 /d/IdeaProjects/java11/demo/git_learn (master)
$ git push
Enumerating objects: 7, done.
Counting objects: 100% (7/7), done.
Delta compression using up to 16 threads
Compressing objects: 100% (4/4), done.
Writing objects: 100% (4/4), 353 bytes | 353.00 KiB/s, done.
Total 4 (delta 3), reused 0 (delta 0), pack-reused 0
remote: Powered by GITEE.COM [GNK-6.4]
To gitee.com:lvqifeng/study-demo.git
   52ab41e..78a2ac4  master -> master

lvzb3@LAPTOP-3E5DGGO8 MINGW64 /d/IdeaProjects/java11/demo/git_learn (master)
$ git push zhineng1
Enumerating objects: 7, done.
Counting objects: 100% (7/7), done.
Delta compression using up to 16 threads
Compressing objects: 100% (4/4), done.
Writing objects: 100% (4/4), 353 bytes | 353.00 KiB/s, done.
Total 4 (delta 3), reused 0 (delta 0), pack-reused 0
To file:///d/temp/zhineng.git
   52ab41e..78a2ac4  master -> master

lvzb3@LAPTOP-3E5DGGO8 MINGW64 /d/IdeaProjects/java11/demo/git_learn (master)
$ git branch -av
  local/test_master       52ab41e [behind 1] add readme.md
* master                  78a2ac4 update One line
  temp                    f5403cd 添加分支操作命令
  remotes/origin/master   78a2ac4 update One line
  remotes/origin/temp     f5403cd 添加分支操作命令
  remotes/zhineng1/master 78a2ac4 update One line

三、Git与GitHub的简单同步

02|配置公私钥

04|把本地仓库同步到GitHub

git merge --allow-unrelated-histories 允许 2个毫不相干的分支做合并。合并前要先做 remote add 的绑定

$ git merge -h
usage: git merge [<options>] [<commit>...]
   or: git merge --abort
   or: git merge --continue

    -n                    do not show a diffstat at the end of the merge
    --stat                show a diffstat at the end of the merge
    --summary             (synonym to --stat)
    --log[=<n>]           add (at most <n>) entries from shortlog to merge commit message
    --squash              create a single commit instead of doing a merge
    --commit              perform a commit if the merge succeeds (default)
    -e, --edit            edit message before committing
    --cleanup <mode>      how to strip spaces and #comments from message
    --ff                  allow fast-forward (default)
    --ff-only             abort if fast-forward is not possible
    --rerere-autoupdate   update the index with reused conflict resolution if possible
    --verify-signatures   verify that the named commit has a valid GPG signature
    -s, --strategy <strategy>
                          merge strategy to use
    -X, --strategy-option <option=value>
                          option for selected merge strategy
    -m, --message <message>
                          merge commit message (for a non-fast-forward merge)
    -F, --file <path>     read message from file
    -v, --verbose         be more verbose
    -q, --quiet           be more quiet
    --abort               abort the current in-progress merge
    --quit                --abort but leave index and working tree alone
    --continue            continue the current in-progress merge
    --allow-unrelated-histories
                          allow merging unrelated histories
    --progress            force progress reporting
    -S, --gpg-sign[=<key-id>]
                          GPG sign commit
    --autostash           automatically stash/stash pop before and after
    --overwrite-ignore    update ignored files (default)
    --signoff             add a Signed-off-by trailer
    --no-verify           bypass pre-merge-commit and commit-msg hooks

四、Git单分支集成协作时的常见常见

01|不同人修改了不同文件如何处理

02|不同人修改了同文件的不同区域如何处理

03|不同人修改了同文件的同区域如何处理

04|同时变更了文件名和文件内容如何处理

05|把同一文件改成了不同文件名如何处理

git merge --abord: git pull 出现冲突时,使用该命令回到merge 前。本地 git merge 修改解决冲突后,需要commit 然后push到远程仓库。

五、Git集成使用禁忌

01|禁止向集成分支执行push -f操作

git push -f origin featurename: 该操作会强制提交,用的不好会导致节点消失

02|禁止向集成分支执行变更历史操作

git rebase 命令只能修改本地为提交到远程仓库的 操作,而不要尝试修改已经提交到远程的操作,这样会导致其他人的本地远程分支存在问题,无法正常提交。

六、初始GitHub

七、使用GitHub进行团队协作

八、GitLab实践

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值