git安装
Linux
- Ubuntu
shell
sudo apt install git
- Centos
shell
sudo yum -y install git
windows
git基本操作
安装git本地仓库
找到一个目录下面执行下面命令
shell
git init

git配置
shell
git config user.name 'xxxx' #配置仓库用户名
git config ueer.email
git config -l #查看配置信息
git config --unset #清楚每个配置项
git config --global user.name 'xxxx'# 对机器上的所有仓库进行配置 如果要删除也要加--global
git config --global --unset user.name
认识⼯作区、暂存区、版本库

- 简单理解工作区就是和.git处于同级的文件,我们代码开发编写在这里
- git add 指令就是把工作区内的内容交到版本库的暂存区,暂存区存储的是commit ID,就是一个索引。
- git commit 指令就是把暂存区的内容进行提交,此时HEAD就会指向的master分支,master就指向我们改分支最新的一次commit ID。因此git commit 之后就有了新的commit ID,通过HEAD可以拿到最新的commit ID。
查看.git文件

- index 就是我们的暂存区,add 后的内容都是添加到这里的。
- HEAD 就是我们的默认指向 master 分⽀的指针
- objects 为 Git 的对象库,⾥⾯包含了创建的各种版本库对象及内容。当执⾏ git add 命令时,暂存区的⽬录树被更新,同时⼯作区修改(或新增)的⽂件内容被写⼊到对象库中的⼀个新的对象中,就位于 ".git/objects" ⽬录下,让我们来看看这些对象有何⽤处:
shell
czy@iv-ydymv3isjkcva4g3znj3:~/gitcode$ ls .git/objects/
03 a1 e6 info pack
- 查找 object 时要将 commit id 分成2部分,其前2位是⽂件夹名称,后38位是⽂件名称。找到这个⽂件之后,⼀般不能直接看到⾥⾯是什么,该类⽂件是经过 sha (安全哈希算法)加密过的⽂件,好在我们可以使⽤ git cat-file 命令来查看版本库对象的内容:
shell
git cat-file -p [commit ID]


git常用指令
git add指令
shell
git add .#当前目录下文件进行添加到暂存区
git add -A
git add [filename]
git commit指令
shell
git commit -m "xxxxx"
git commit [file1] [file2] ... -m "xxxx"
git cat-file -p指令
shell
git cat-file -p [commit ID]
查看仓库状态
shell
git status
git diff指令
shell
git diff [file] #⽤来显⽰暂存区和⼯作区⽂件的差异
git diff HEAD -- [file]#查看版本库和⼯作区⽂件的区别
版本回退
shell
git reset [--soft | --mixed | --hard] [HEAD]
- --mixed 为默认选项,使⽤时可以不⽤带该参数。该参数将暂存区的内容退回为指定提交版本内容,⼯作区⽂件保持不变。
- --soft 参数对于⼯作区和暂存区的内容都不变,只是将版本库回退到某个指定版本。
- --hard 参数将暂存区与⼯作区都退回到指定版本。切记⼯作区有未提交的代码时不要⽤这个命令,因为⼯作区会回滚,你没有提交的代码就再也找不回了,所以使⽤该参数前⼀定要慎重。
- HEAD:也可以写为commit ID表⽰指定退回的版本。
- HEAD 表⽰当前版本
- HEAD^ 上⼀个版本
- HEAD^^ 上上⼀个版本
- 以此类推...
- HEAD~0 表⽰当前版本
- HEAD~1 上⼀个版本
- HEAD^2 上上⼀个版本
- 以此类推...
git log指令
shell
git log #查看⼀下提交⽇志
git reflog #查看记录本地的每⼀次命令
git log --graph --pretty=oneline --abbrev-commit#显示图形、单行、简短提交ID
git checkout --指令
shell
#命令让⼯作区的⽂件回到最近⼀次 add 或 commit 时的状态
#-- 很重要,切记不要省略,⼀旦省略,该命令就变为其他意思了
git checkout -- [file]
git rm指令
shell
#将⽂件从暂存区和⼯作区中
git rm filename.txt
# 删除后立即提交
git rm filename.txt && git commit -m "删除 filename.txt"
git last
shell
git last#显⽰最近⼀次的提交
分支相关指令
shell
git branch ##查看当前本地所有分⽀
git branch dev #新建分⽀dev
git checkout dev #切换到dev分支
# 创建新分支并立即切换过去
git checkout -b new_branch_name
# 从特定起点创建分支并切换
git checkout -b new_branch_name main
git checkout -b new_branch_name develop
git checkout -b new_branch_name commit_hash
#合并 dev 分⽀ 注意合并分支不建议在master直接合并
#可以先合并先把master分支合并到dev分支 如果
#有冲突解决冲突,接着切换到master分支合并我们的dev分支
git merge dev
#删除dev分支 注意不可以在dev分支删除dev分支 要切换到其他分支操作
git branch -d dev #把改分支合并到其他分支之后可以才可以删除不然无法删除
git branch -D dev3#强制删除
工作区的信息储藏
shell
#可以将当前的⼯作区信息进⾏储藏,被储藏的内容可以在将来某个时间恢复出来。
git stash
#查看工作区代码存藏到那个位置
git stash list
#恢复工作区
git stash pop
git stash apply #这样进行恢复tash内容并不删除,你需要
git stash drop 来删除
#指定恢复的stash
git stash apply stash@{0} ,
分支合并两种模式
- 通常合并分⽀时,如果可能,Git 会采⽤ Fast forward 模式。还记得如果我们采⽤ Fast forward 模式之后,形成的合并结果:

在这种 Fast forward 模式下,删除分⽀后,查看分⽀历史时,会丢掉分⽀信息,看不出来最新提交到底是 merge 进来的还是正常提交的。
- --no-ff ⽅式的 git merge
shell
git merge --no-ff -m "merge with no-ff" dev2#合并我们的dev分支 并提交
# -no-ff 参数,表⽰禁⽤ Fast forward 模式。禁⽤ Fast forward 模式后合
# 并会创建⼀个新的 commit ,所以加上 -m 参数,把描述写进去。

远程仓库
- 远程仓库与本地仓库在 Git 的管理机制上是相同的,它作为存储在服务器上的副本,除备份提交记录外,更核心的职能是支撑多人协作。本地与远程仓库之间的交互,本质上是通过分支的推送与拉取,来同步和整合各自的提交历史。
创建远程仓库

克隆远程仓库
shell
#使⽤ HTTPS ⽅式:
git clone https:#这个就是你远程仓库提供的http链接

shell
#使用ssh方式
git@gitee.com:goat-cao-chaoyang/git-learning.git
- 创建SSH Key。在⽤⼾主⽬录下,看看有没有.ssh⽬录,如果有,再看看这个⽬录下有没有id_rsa 和 id_rsa.pub 这两个⽂件,如果已经有了,可直接跳到下⼀步。如果没有,需要创建SSH Key:ssh-keygen -t rsa -C "你自己的邮箱一路回车即可"
⾥⾯有 id_rsa 和 id_rsa.pub 两个⽂件,这两个就是SSH Key的秘钥对, id_rsa 是私钥,不能泄露出去, id_rsa.pub 是公钥,可以放⼼地告诉任何

- 添加⾃⼰的公钥到远端仓库。

- 下面就可以进行colne了
进行push
shell
git push <远程主机名> <本地分⽀名>:<远程分⽀名>
# 如果本地分⽀名与远程分⽀名相同,则可以省略冒号:
git push <远程主机名> <本地分⽀名>
git push original master
拉取远程仓库
shell
git pull <远程主机名> <远程分⽀名>:<本地分⽀名>
# 如果远程分⽀是与当前分⽀合并,则冒号后⾯的部分可以省略。
git pull <远程主机名> <远程分⽀名>
.gitignore文件

shell
1.空行会被忽略,可用于提高可读性。
2.注释:以 # 开头的行是注释。
3. # 忽略所有 .log 文件: *.log
4. # 忽略所有名为 "temp" 的文件夹: temp/
5. # 忽略所有名为 "build" 的文件夹: build/
6. # 忽略根目录下的 "TODO" 文件: /TODO
7. 通配符:
*:匹配零个或多个任意字符(除了路径分隔符 /)。
?:匹配一个任意字符(除了路径分隔符 /)。
[abc]:匹配任何一个列在方括号中的字符。
8.路径规范:
以斜杠 / 开头表示模式相对于 .gitignore 文件所在的目录(通常是项目根目录)。
不以斜杠开头表示模式可以匹配项目中的任何位置。
# 只忽略当前目录下的 "temp" 文件/文件夹
/temp
# 忽略项目中任何位置的 "temp" 文件/文件夹
temp
# 只忽略 doc/ 目录下的 .txt 文件,但不忽略 doc/sub/aaa.txt
/doc/*.txt
9. 双星号**
用于匹配任意中间目录。
**/foo:匹配任何位置的名为 foo 的文件或文件夹。
foo/**/bar:匹配任何以 foo 开头,以 bar 结尾的路径。
# 忽略任何位置的 build/ 文件夹
**/build/
# 忽略 doc/ 目录及其所有子目录下的 .pdf 文件
doc/**/*.pdf
10. 否定模式
以感叹号 ! 开头的行会取消忽略,即使该文件被之前的模式匹配到了。
注意:如果一个文件的父目录被忽略了,那么否定模式将无法重新包含该文件。
# 忽略所有 .a 文件
*.a
# 但是不忽略 lib.a,即使它已经被上面的规则匹配到了
!lib.a
查找.gitignore规则错误
shell
hyb@139-159-150-152:~/git_teaching$ git check-ignore -v a.so
.gitignore:3:*.so a.so
强制添加文件(不受.gitignore控制)
shell
git add -f [filename]
给命令配置别名
shell
git config --global alias.st status
#--global 参数是全局参数,也就是这些命令在这台电脑的所有Git仓库下都有⽤。如果不加,那只针对当前的仓库起作⽤。
git config --global alias.last 'log -1'
标签管理
- 标签 tag ,可以简单的理解为是对某次 commit 的⼀个标识,相当于起了⼀个别名。例如,在项⽬发布某个版本的时候,针对最后⼀次 commit 起⼀个 v1.0 这样的标签来标识⾥程碑的意义。这有什么⽤呢?相较于难以记住的 commit id , tag 很好的解决这个问题,因为 tag ⼀定要给⼀个让⼈容易记住,且有意义的名字。当我们需要回退到某个重要版本时,直接使⽤标签就能很快定位到。
创建标签
在Git中打标签⾮常简单,⾸先,切换到需要打标签的分⽀上
shell
git tag [name]
- 默认标签是打在最新提交的 commit 上的。那如何在指定的commit上打标签呢?⽅法是找到历史提交的commit id,然后打上就可以了,⽰例如下
shell
#历史记录
hyb@139-159-150-152:~/git_teaching$ git log --pretty=oneline --abbrev-commit
97811ab (HEAD -> master, tag: v1.0, origin/master, origin/HEAD) add .gitignore 60e6b0a update README.md.
7ce3183 create file.txt
c6ce3f0 Initial commit
#对 Initial commit这次提交打标签
hyb@139-159-150-152:~/git_teaching$ git tag v0.9 c6ce3f0 10hyb@139-159-150-152:~/git_teaching$ git tag
11v0.9
12v1.0
- Git 还提供可以创建带有说明的标签,⽤-a指定标签名,-m指定说明⽂字,格式为:
shell
git tag -a [name] -m "XXX" [commit_id]
查看所有标签
shell
git tag
- 注意,标签不是按时间顺序列出,⽽是按字⺟排序的。
shell
#查看标签信息。
git show [tagname]
删除标签
标签没有被推送到远程
shell
git tag -d [标签名字]
git push origin --tags#以⼀次性的全部推送到远端
- 因为创建的标签都只存储在本地,不会⾃动推送到远程。所以,打错的标签可以在本地安全删除。如果要推送某个标签到远程,使⽤命令 git push origin
标签已经被推送到远程如何删除
- 先从本地删除
shell
hyb@139-159-150-152:~/git_teaching$ git tag
v1.0
hyb@139-159-150-152:~/git_teaching$ git tag -d v1.0
Deleted tag 'v1.0' (was 97811ab)
- 然后,从远程删除。删除命令也是push,但是格式如下:
shell
hyb@139-159-150-152:~/git_teaching$ git push origin :refs/tags/v1.0
remote: Powered by GITEE.COM [GNK-6.4]
To gitee.com:hyb91/git_teaching.git
[deleted] v1.0
远程分支删除后,本地 git branch -a 依然能看到的解决办法
当前我们已经删除了远程的⼏个分⽀,使⽤ git branch -a 命令可以查看所有本地分⽀和远程分⽀,但发现很多在远程仓库已经删除的分⽀在本地依然可以看到。
- 使⽤命令 git remote show origin ,可以查看remote地址,远程分⽀,还有本地分⽀与之相对应关系等信息。
- 此时我们可以看到那些远程仓库已经不存在的分⽀,根据提⽰,使⽤ git remote prune origin 命令: