【Git】之 入门教程 + 使用示例

参考

https://github.com/MarkLodato/visual-git-guide
https://www.runoob.com/manual/git-guide/
https://git-scm.com/doc

Ubuntu上openVPN配置参考: https://www.bbsmax.com/A/LPdoRP9G53/

Git 使用指南:https://www.gjtool.cn/pdfh5/pdf.html?file=https://www.gjtool.cn/pdfh5/git.pdf

文档:A Visual Git Reference.pdf(https://github.com/MarkLodato/visual-git-guide
链接: https://pan.baidu.com/s/11okGic_Dvl0l5DUV4-mg2g
提取码: zada

Git 作用

最开始接触git是因为github网站上有很多开源的强大项目。(所以很长时间我只是从github上clone代码:https://blog.csdn.net/u010637291/article/details/106241389

但其实git是一个分布式版本控制系统,类似于常用的版本控制工具 CVS, Subversion 等。但不同的是,git采用了分布式版本库的方式,不必服务器端软件支持。

注:版本控制系统在多人共同完成某一项目时很有用,代码同步可省却很多人力,并可方便查看哪个人在什么时候修改了什么内容。

Git 结构如下所示:

在这里插入图片描述

Git 安装

windows上安装:https://git-scm.com/
ubuntu上安装: $ sudo apt-get install git

Git 5分钟示例操作

示例1: github上新建repository,本地新建repository并上传到github端(详细过程可参加下一章节)

# github上创建repository: e.g., https://github.com/waerhu/HelloWorld.git
git init # 本地创建repository
git init HelloWorld # 指定本地repository目录
# 本地创建文件README.md并写入内容后
git add README.md # 上传README.md到缓存区index
git status # 查看当前缓存区index未提交到HEAD的内容
git commit -m "Adding a new file - README.md" # 提交缓存区index的内容到HEAD
git remote add origin https://github.com/waerhu/HelloWorld.git # 链接本地工作区到github上的远程库
git push -u origin master # 上传HEAD中内容到远程库
# 详细过程可参加下一章节

示例2:github上已有repository,本地从github端克隆整个项目到本地工作区,修改内容后,再提交到github。

# github已有repository: e.g., https://github.com/waerhu/HelloWorld.git
git clone https://github.com/waerhu/HelloWorld.git # 克隆github端程序到本地
# 本地修改文件README.md后
git add README.md # 上传README.md到缓存区index
git commit -m "Adding content to README.md" # 提交缓存区index的内容到HEAD
git push -u origin master # 上传HEAD中内容到远程库

在这里插入图片描述

Git 常见命令

  1. Git 配置: 用户名和email
git config --global user.name 'runoob'  # 可自定义用户名
git config --global user.email test@runoob.com  # 可自定义email

# 可查看所有的config:
git config --list
  1. 新建repository:
git init # 创建repository
git init newrepo # 指定repository目录为newrepo(newrepo可自定义) 
  1. 提交修改(本地工作区working dir -> 缓存区index/stage)
git add README.md  # 添加单个指定文件(文件可自定义)
git add README.md newfile.txt  # 提交多个指定文件
git add *  # 提交指定目录下所有文件
  1. 提交版本(缓存区index/stage -> HEAD)
git commit -m "note for commitment" # -m 指定注释,注释语可自定义

commit也可直接提交本地工作区内容到HEAD(working dir -> HEAD),即加上参数-a

# 等同于:
# git add README.md
# git commit -m "note for commitment"
# 
git commit -am "note for commitment" # -am
  1. 同步代码到远程库(HEAD -> Github)
git remote add origin https://github.com/waerhu/HelloWorld.git  # 链接到远端库,远端库地址可自定义

git push origin master  # 同步到远端库,推送master分支到远程库
# or
git push -u origin master # 第一次同步,需带有-u参数

# 推动另一test分支到orifin远程库
git push origin test

-u:因为远程库是空的,所以我们在第一次推送 master 分支时,要加上 -u 参数,Git不但会把本地的 master 分支内容推送的远程新的 master 分支,还会把本地的 master 分支和远程的 master 分支关联起来,在以后的推送或者拉取时就可以简化命令。

  1. 从远端库clone代码(Github -> working dir)
git clone https://github.com/waerhu/HelloWorld.git # 远端库可自定义
  1. 从远端库同步代码到本地 (Github -> working dir)
git pull origin master

# or
git fetch origin 
git reset --hard origin/master
  1. 退回/恢复

退回/恢复缓存区代码给本地工作区(缓存区index/stage -> 工作区working dir)

git checkout -- README.md  # 文件可自定义

退回/恢复/复制HEAD代码到缓存区,或,缓存区和工作区(HEAD -> index/stage 或 HEAD -> index/stage & working dir)

# git reset 默认从HEAD复制到index
git reset
git reset -- hard # 同时copy HEAD到index和working dir

在这里插入图片描述


退回/恢复/复制指定文件的HEAD代码到缓存区(HEAD -> index/stage )

# git reset 默认从HEAD复制到index,
# 等同于git reset HEAD -- README.md, 
git reset -- README.md # 文件可自定义

在这里插入图片描述


类似于退回HEAD内容,也可以回退HEAD上一版本(HEAD~):
退回/恢复/复制指定文件HEAD~代码到缓存区(HEAD~ -> index/stage & working dir)

git checkout HEAD~ -- README.md # 文件可自定义

在这里插入图片描述


如果在回退之前版本同时,需要回退HEAD内容,可用git reset:
退回/恢复HEAD到上3个版本(HEAD -> HEAD~3):
注: HEAD表示当前版本,则HEAD~表示上一个版本,那么上上版本就是HEAD~~,上n个版本即为HEAD~n,如HEAD~3

# HEAD表示当前版本,则HEAD~表示上一个版本,那么上上版本就是HEAD~~,上n个版本即为HEAD~n,如HEAD~3
git reset HEAD~3 # 仅copy HEAD~给stage/index,未copy给working dir
git reset HEAD~3 --hard  #copy HEAD~给stage/index和working dir
git reset HEAD~3 --soft  #未copy HEAD~给stage/index或working dir

在这里插入图片描述


  1. 查看状态
git status
# or
git status -s # 以单行显示结果
  1. 查看log
git log
#
git log --pretty=oneline  # log 展示效果为:一条log为一行
git config format.pretty oneline # 也可直接配置config,使得每次显示历史记录时,每个提交的信息只显示一行
#
git log -3 # 查看最后三次提交记录信息
#
git reflog     #  查看历史记录的版本号id
  1. 查看差异
git diff -- README.md # beteen working dir and index/stage
git diff --cached -- README.md # between index/stage and HEAD
git diff HEAD -- README.md # between working dir and HEAD

# 多个文件
git diff testdir/testfile.txt testdir/testfile.c
git diff testdir/*
  1. 可视化查看
gitk
  1. 分支:查看、 创建、进入、合并
git branch # 查看分支
git branch test # 创建分支test,分支名可自定义
git checkout test # 切换到test分支
# or
git checkout –b test # 创建并进入分支
#
git branch –d test # 删除分支test
#
git checkout master # 切换回master分支
git merge test # 合并test分支到主分支master
# 
git push origin test # 将test分支推送到远端仓库,不然该分支就是不为他人所见的
  1. 创建 SSH KEY
ssh-keygen -t rsa -C "[email protected]" # email 可自定义

再将密钥文件cat 查看,和复制到git ssh 设置页面。

  1. 查看远程库信息
git remote -v
  1. 生成patch
git diff --binary commitID1 commitID2 > 0001-patchName.patch		# 参数--binary表示二进制文件也会添加到patch中
#
git apply --check 0001-patchName.patch # 检查patch文件是否可用,没有显示表示无冲突可直接应用
#
git apply 0001-patchName.patch # 打入patch到当前项目

Git 使用示例详解

1 Github 创建帐号并登录后,创建新的repository:

在这里插入图片描述创建完后,生成HelloWorld repository:
在这里插入图片描述

2 本地git init 或者 git clone repository

因为此时远程库为空,我们通常为本地写好代码后,直接在本地创建git init repository,再更新到远程库。
当远程库已有我们代码的初版后,可通过git clone克隆到本地。

2.1 本地新建repository

使用Git前,需要先建立一个仓库(repository)。可以使用一个已经存在的目录作为Git仓库或创建一个空目录。如使用当前目录作为Git仓库,我们只需使它初始化。

git init

使用我们指定目录作为Git仓库。

git init HelloKitty

在这里插入图片描述

2.2 创建本地新文件

如创建README.md

cd HelloKitty/
touch READMD.md
vim README.md
# insert: i: This is a new repository, created by waerhu. Esc.
# save: :wq

在这里插入图片描述

在这里插入图片描述

2.3 添加本地文件到index

在创建repository后,会有一个隐藏文件夹.git,可查看该文件夹下内容:

cd .git
ls

在这里插入图片描述

Git的结构包括:
1)本地工作区域(即当前本地目录Working Dir),
2)缓存区(Stage或Index):临时保存改动到一个缓存区,
3)HEAD(指向最后一次提交的结果)。

如下图所示:(History即HEAD)

在这里插入图片描述

可看到当前.git下有HEAD,但没有index(因为此时还没有添加内容到缓存区)。可通过git add添加文件到index,如添加README.md:

git add README.md

此时,再查看.git文件夹会发现已经有index。
在这里插入图片描述

2.4 提交index文件到HEAD

在git add后,我们的更新在缓存区index中,并未进行提交,我们可通过git status查看当前工作区内未提交的内容:

git status

在这里插入图片描述可看到当前缓存区有我们创建的新文件README.md未提交。
提交缓存区的文件到HEAD的操作为(可在提交时添加备注信息,-m后即为备注信息):

git commit -m "Adding a new file - README.md"

此时再查看缓存区index是否有未提交内容,可看到已经没有:

git status

在这里插入图片描述

注:可通过 gitk 图形化界面查看commit

gitk

在这里插入图片描述

2.5 将HEAD中内容推送到远程库

由于此时我们的repository是本地创建的(git init),还没有链接到远程库,所以我们的链接及推送操作为:

git remote add origin https://github.com/waerhu/HelloWorld.git

其中的http地址即我们在github上创建的空repository地址,如第一节图所示。
如果本地的工作区是从远程库上git clone的,即不需要再次进行链接远程库。
在链接本地工作区到远程库后,可将现在已经在本地HEAD 中的改动提交到远程库:

git push -u origin master

在这里插入图片描述

此时github上的远程库已更新:

在这里插入图片描述

3. Git 同步远程端Github到本地

之前的操作均为,本地repository的内容提交到远程端github端。那么在多人如此操作后,我们本地的repository可能就和远程库github上不一致。

如我们在示例1后进行了示例2操作,此时github上的README.md已经变为:
在这里插入图片描述但此时我们本地的repository的README.md的内容还是原来的:
在这里插入图片描述在这里插入图片描述在这里插入图片描述

注:
git status 可查看本地工作区、缓存区index和HEAD间的不一致。此时可看到本地三者之间是同步状态。
git log可查看操作的log。
在本地工作区与远程端不一致时,是无法进行提交本地内容到远程端。 Updates were rejected because the remote contains work that you do not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., ‘git pull …’) before pushing again.

将远程端github上内容同步到本地操作有:

git pull origin master

在这里插入图片描述此时,能看到README.md内容已与github上一致。并且通过git log查看到的log也与github上同步。

此外,同步远程端github上内容到本地的命令还有:

git fetch origin 
git reset --hard origin/master

4. Git 回退操作

Git在工作时,有本地工作区(即我们的代码编辑),缓存区index(本地.git目录下)和HEAD。这导致我们在一天工作后,想将我们的修改代码提交到服务器端或github端时,需要经过重重的提交:
1)从本地工作区提交到缓存区index:git add
2)从缓存区index提交到HEAD: git commit
3)从HEAD 提交到github端: git push

而这些重重的提交实际上相当于二级缓存,在我们修改代码后或一些误操作后,很容易回退到原始状态。

示例说明如下:
当前工作区working dir, 缓存区和HEAD保存内容一致,修改并提交至:Working dir 有一些内容不在缓存区index,缓存区index有一些内容不在HEAD:

git status
vim README.md # Adding "Content in HEAD" to README.md
git add README.md
git commit -m "Adding content to HEAD"
#
vim README.md # Adding "Content in index" to README.md
git add README.md
#
vim README.md # Adding "Content in index" to README.md
#
git status

在这里插入图片描述
此时:
README.md (工作区):

Content in HEAD
Content in index
Content in current working dir

README.md(缓存区index) :

Content in index
Content in current working dir

README.md (HEAD):

Content in HEAD

可看到此时工作区有:

Changes to be committed
Changes to be staged for commit

为了详细看到这些Changes,我们可使用git diff命令:

在这里插入图片描述

  1. 查看工作区与缓存区index区别:
git diff
  1. 查看缓存区index与HEAD区别:
git diff --cached
  1. 查看工作区与HEAD区别:
git diff HEAD

在这里插入图片描述

  1. 工作区回退到缓存区index内容
    对于在本地工作区的一些修改,如README.md,在提交至缓存区index之前,可手动删除。但有时也许由于改动较多,想直接回退到缓存区内容:
git checkout --README.md

在这里插入图片描述
2) 缓存区index回退到HEAD

git reset -- README.md

为了查看是否回退成功,我这里将缓存区回退后的内容,再赋给工作区内容:

git status
git checkout -- README.md
cat README.md

在这里插入图片描述

  1. 其实也可直接将HEAD内容赋给工作区:
git checkout HEAD -- README.md

5 Git 分支

创建分支,并进入分支,合并分支:

git branch test # 创建分支test
git checkout test # 切换到test分支
#
git checkout master # 切换会master分支
git merge test # 合并test分支到主分支master

6 删除git本地仓库

删除git本地仓库,即删除.git文件即可:默认情况下.git是隐藏文件夹。可通过如下方式查看

ls -a

Step 1: 删除.git:

rm -rf .git

确认是否删除.git文件,是否还有git相关命令:

ls -a # 没有git文件夹
git status # fatal: Not a git repository (or any parent up to mount point /media/me/nvme2n1) Stopping at filesystem boundary (GIT_DISCOVERY_ACROSS_FILESYSTEM not set).

Step 2: 最后删除本地仓库的文件即可:

 rm -rf 本地仓库文件夹/

7 删除git远程端文件

git add 只会将新建的或者已更改的文件添加到索引区,而不会添加删除的文件
git add -u 只会去处理已修改或者已删除的文件,但是不会处理新建的文件

sudo rm test 
git add -u
git commit -m "delete test"
git push

实际问题记录

1) 发现一些文件无法上传,也无法通过git status查找到

发现在本地添加的.pcm文件无法被git status 查找到(并且无法通过git add添加),这是由于在 .gitignore 文件中设置了特定文件不进行版本管理:

cat .gitignore

# 也可根据自己需要自己创建.gitignore
touch .gitignore

在这里插入图片描述
如果还是想要上传,可添加 -f 参数。

2)通常的情况是,只想上传本地部分修改文件(而非全部修改文件)

假设想上传的文件是a.txt, 但b.txt也被修改过(可能还没修改完)

git status -s # 查看状态
git add a.txt

# !!! important!!!
git stash -u -k # 忽略其他文件,把现修改的隐藏起来,这样提交的时候就不会提交未被add的文件
# !!!

git commit a.txt -m "update on a.txt"
git push # 可能需要 git pull

# !!!important!!!
git stash pop # 恢复之前忽略的文件(非常重要的一步)
# !!!

3) 本地有修改,想将远程库的最新版本直接覆盖本地

ref: https://blog.csdn.net/weixin_38883338/article/details/96832802

使用git pull出错,错误如下:xxxx仅代表示例

me@2990wx:/media/me/nvme2n1/tmp$  git pull # error shown as follows:
Username for 'https://github.com': xxxx
Password for 'https://[email protected]': 
remote: Enumerating objects: 23, done.
remote: Counting objects: 100% (23/23), done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 12 (delta 10), reused 12 (delta 10), pack-reused 0
Unpacking objects: 100% (12/12), done.
From https://github.com/xxxx/Txxx
   8e91f1c..62e3304  master     -> origin/master
Updating 8e91f1c..62e3304
error: Your local changes to the following files would be overwritten by merge:
	xxxx.xxxx
	xxxx.xxxx
	xxxx.xxxx
Please, commit your changes or stash them before you can merge.
Aborting

直接覆盖操作为:

git fetch --all
git reset --hard origin
git pull

如果想将冲突文件保存本地更改的时候,可以将 git reset --hard 换成 git reset --soft

Guess you like

Origin blog.csdn.net/u010637291/article/details/107660891