目录
三个区四个状态
1.工作区 (Working Directory)
工作时的目录
2.暂存区(Staging area)
暂存区保存了下次将要提交的文件列表信息。
3.版本库
不同版本库的历史记录
为什么要搞一个暂存区,先git add到暂存区,再git commit版本库?
通常一个版本是若干的新增代码源文件,现有源代码的修改或删除。这一系列操作也不是一下子完成,这时他们就暂存起来,等全部完成后,就一并提交。
四个状态:
工作区文件的四个状态,分别为:
modified: 已修改,提交已经暂存的更改,不会提交没有暂存的更改。(提交已经暂存的更改[绿色],不会提交没有暂存的更改)
deleted:已删除,不会提交。要add到暂存区
Untracked:未跟踪,表示没有暂存的新文件,不会被提交。
new:已添加索引,表示已经暂存的新文件,会提交。
配置git账户
$ git config --global user.name "你的姓名" $ git config --global user.email "email地址" #查看 $ git config --list
创建本地git库
1.创建或准备项目工程文件夹
$ mkdir 文件名 $ cd 文件名 $ pwd $ ls
2.初始化仓库
$ git init
把文件添加到版本库的(3步)
任意编写一个文件,保存到项目中。
1.创建或准备一个文件:readme.txt
hello git
注意:不能使用记事本,你可使用notepad++,vsCode,eclipse等
2.添加到仓库的暂存区
git add "添加的文件名"
你可以一次添加多个文件
3.提交更新
git commit -m "自定义提交上去的名字"
初始化
创建一个新的 git 版本库。这个版本库的配置、存储及一系列的操作信息会被保存到 .git 文件夹中,便于用户跟踪、管理。
#方法一:进入一个空目录,执行以下命令,这样就可以创建一个空的版本库(仓库) $ git init #方法二:创建一个指定名称的版本库 $git init 名称 #方法三:克隆远程仓库,git clone <url> $ git clone https://gitee.com/mchpony.test1.git #查看 $ ls -A
add 添加
#添加文件 $ git add . #添加一个文件 $ git add "文件名" #添加一个子目录中的文件 $ git add /path/to/file/HelloWorld.c #支持正则表达式 $ git add ./*.java
commit提交
-
工作区的文件是否通过
git add
命令添加到暂存区中; -
提交时必须使用
-m
选项添加提交的描述信息
# 提交时附带提交信息 $ git commit -m "添加Xxxx文件" #直接提交,跳过添加暂存区,使用`-a`选项(不建议) $ git commit -a -m "修改Xxxxx文件"
status状态
#显示分支,未跟踪文件,更改和其他不同 $ git status
可以通过-s
选项,实现简洁方式查看状态。如:git status -s
或git status --short
#简洁方式查看状态 $ git status -s # $ git status --short M README #文件在工作区已修改但未暂存 MM Rakefile #文件已修改暂存后又修改 A lib/git.rb #新添加到暂存区 M lib/simplegitrb #已修改且已暂存 ?? LICENSE.txt #新添加的文件,但未跟踪
diff查看文件修改后的差异
#查看工作目录中当前文件和暂存区域快照之间的差异 $ git diff #查看已暂存文件与最后一次提交的文件差异 $ git diff --cached #显示工作目录和最近一次提交不同 $ git diff HEAD
工作区&暂存区不一样,你可怎么处理
git add.
git rm | reset....
暂存区&版本库,你可怎么处理
git commit
git reset
工作区&版本库,你可怎么处理
git commit -a 同步到版本库
git reset 回退到上一版本,取消工作区的更新
rm删除文件
#删除工作区中指定文件 git rm 文件 #删除已经添加到暂存区的文件,要强制删除 git rm -f 文件 #从暂存区删除,但工作区保留 git rm --cached 文件 #递归删除,及如果后面跟的是一个目录作为参数,则会递归删除整个目录中的所有子目录和文件 git rm -r *
mv重命名文件
#重命名 $ git mv 文件名 新文件名
其实运行 git mv就相当运行了下面三条命令:
$ mv 1.txt ont.txt #改名 $ git rm 1.txt #删除原文件 $ git add one.txt #添加one.txt
移动文件
# 移动 $ git mv 文件 路径/新文件
log 日志
# 显示所有提交 $ git log # 显示某几条提交信息 $ git log -n 10 # 显示一行一个版本 $ git log --online 10
reset撤销版本
-
--soft:这个参数表示在版本库中回退到旧的版本。而最新的版本内容会移到暂存区保存。
-
--mixed: 这个参数表示在版本库中进行版本回退,同时重 置暂存区。(默认选项)
-
--hard:这个参数表示在版本库中进行版本回退,同时重置暂存区和工作区。
# 表示在版本库的master分支中回退到上一个版本 $ git reset --soft HEAD^
HEAD说明:
-
HEAD
表示回退到当前最新版本
# 回退到当前最新的版本,并重置暂存区 $ git reset --mixed HEAD
-
HEAD
表示回退到上一个版本
# 回退到上一个版本,并重置暂存区 $ git reset --mixed HEAD^
3.HEAD~N
表示回退到上N个版本
#回退到上两个版本,并重置暂存区 $ git reset --mixed HEAD~2
4.回退指定版本
$ git reset 版本号
5.将本地的状态回退到和远程的一样
$ git reset --hard origin/master #将本地的状态回退到和远程一样
恢复
如果希望把销毁的版本恢复回来,首页使用git reflog
命令,查询所有的操作记录,然后再根据撤销的提交编号,恢复回来即可。
# 查看操作记录 $ git reflog 353cab2 (HEAD -> master) HEAD@{0}: reset: moving to HEAD^1 ef427a2 HEAD@{1}: reset: moving to ef427a2 353cab2 (HEAD -> master) HEAD@{2}: reset: moving to HEAD~1 ef427a2 HEAD@{3}: commit: 33 353cab2 (HEAD -> master) HEAD@{4}: commit: 22 df4cfa7 HEAD@{5}: commit (initial): 11 # 根据撤销的提交编号,恢复撤销的版本 $ git reset --hard ef427a2
查看本地仓库中的文件
git ls-tree --full-tree -r --name-only HEAD
二、分支管理
查看分支命令:
git branch
删除分支命令:
git branch -d (branchname)
创建分支命令:
git branch (branchname)
切换分支命令:
git checkout (branchname)
当你切换分支的时候,Git 会用该分支的最后提交的快照替换你的工作目录的内容, 所以多个分支不需要多个目录。
合并分支命令:
git merge 分支名
你可以多次合并到统一分支, 也可以选择在合并之后直接删除被并入的分支。
列出分支
列出分支基本命令:
git branch
没有参数时,git branch 会列出你在本地的分支。
$ git branch * master
此例的意思就是,我们有一个叫做 master 的分支,并且该分支是当前分支。
创建并切换
git chexkout -b (branchname)
删除分支
删除分支命令:
git branch -d (branchname)
分支合并
git merge $ git branch * master newtest $ ls README test.txt $ git merge newtest Updating 3e92c19..c1501a2 Fast-forward runoob.php | 0 test.txt | 1 - 2 files changed, 1 deletion(-) create mode 100644 runoob.php delete mode 100644 test.txt $ ls README runoob.php
1.创建分支newtest,并切换过来
2.在newtest分支新建一个文件,并删除文件
3.提交
4.切回master主分支
5.合并
以下是操作:
git beanch newtest git branch git branch -d testing git branch #去删除文件;新建 git add . git commit -m "" git log ls git checkout master ls #合并 newtest git merge newtest ls git checkout newtest ls git checkout master
合并完后就可以删除分支:
$ git branch -d newtest Deleted branch newtest (was c1501a2).
删除后, 就只剩下 master 分支了:
$ git branch * master
合并冲突
合并并不仅仅是简单的文件添加、移除的操作,Git 也会合并修改。
$ git branch * master $ cat runoob.php
案例:
1.确认合并,两个分支是否一样
2.在主分支修改Demo.java(添加一行,写xxx)并提交
3.切换newtest分支下,也修改Demo.java(添加一行,写yyy)并提交
4.合并,冲突会产生
#1. ls git branch git checkout newtest git branch #2. git checkout master git commit -a -m "在java文件中添加xxx" #3. git checkout newtest git commit -a -m "在newtest分支下打开java文件中添加yyy" git checkout master git checkout newtest git log git checkout master git log #4. git checkout master git merge newtest git commit -a -m "解决了冲突" git merge newtest git branch git checkout newtest git checkout master git merge newtest
案例:
#第一步 #创建文件 touch test1.txt touch test2.txt touch test3.txt ls git status git add . git status cat test1.txt cat test2.txt cat test3.txt git add . git commit -a -m "主分支第一次创建" git checkout -b branch1 git branch ca test.txt cat test2.txt cat test3.txt #第二步 #新建文件 touch test4.txt git status git add test4.txt git status #删除第二个文件 rm test1.txt git status git add test1.txt git status #重命名test2.txt git status git add t2.txt git status git add . git status #修改test3.txt cat test3.txt git status git add test3.txt git status touch test6.txt git status git commit -m "在branch1中删除了test1,新增test4,重命名test2 -> 修改test3" git diff #第三步 git branch master git branch git checkout master git status git branch git add test2.txt git commit -m "主分支中修改test2" ls git checkout branch1 ls #第四步 #切换主分支 合并 git branch ls cat test3.txt cat test2.txt cat t2.txt
三、远程仓库
创建远程仓库
克隆仓库
#基于HTTP协议 $ git clone 地址链接 #基于SSH协议 $ git clone 地址链接
SSH配置
创建SSH key
ssh-keygen -t ed25519 -C "邮箱号"
查看公钥
ssh -T git@gitee.com
添加远程仓库add
# 添加远程仓库 $ git remote add [shortname] [url] # shortname : 别名,一般默认使用origin为远程仓库的别名 # url:远程仓库的URL地址 # 查看远程仓库 $ git remote # 详细查看远程仓库 $ git remote -v $ git remote --verbose # 更详细查看:git remote show <remote> # 可以查看remote地址,远程分支,还有本地分支与之相对应关系等信息 $ git remote show origin
# 详细查看远程仓库 $ git remote -v
已经本地仓库,添加远程仓库
# 进入已存在仓库 $ cd existing_git_repo # 添加远程仓库 $ git remote add origin git@gitee.com:zing168/test.git # 推送 $ git push -u origin master
克隆远程仓库clone
# 克隆远程仓库、以及传递资料时,需要遵循一些网络协议 $ git clone <URL>
##
$ git pugh -v orgin masetr
推送push
$ git push -u origin "master"
通过git push
命令,可以把本地仓库的内容提交/更新到远程仓库中。
1)推送内容到远程仓库的某个分支上
-
语法一:
git push <远程主机名> <本地分支名>:<远程分支名>
-
远程主机名:一般使用远程主机的别名,默认的远程主机的别名为origin
-
-
语法二:
git push <远程主机名> <本地分支名>
-
如果本地分支名与远程分支名相同,则可以省略冒号
-
# 把本地的master分支 推送到 origin主机的master分支上 $ git push origin master $ git push origin master:master # 同上 # 把本地当前分支 推送到 远程主机同名的的分支上 $ git push # 如果本地版本与远程版本有差异,但又要强制推送可以使用 --force 参数 $ git push --force origin master
创建远程分支
# 基于指定的本地分支来创建的远程分支 $ git push <远程主机名> 本地分支名称:远程分支名称 # 基于master,创建远程分支testing $ git push origin master:testing
删除远程分支
$ git push <远端> :远程分支名称 $ git push <远端> --delete 远程分支名称 $ git push yaya :test02 $ git push yaya --delete test02
拉取pull
# git pull <远程主机名> <远程分支名>:<本地分支名> # 更新操作 $ git pull $ git pull origin # 把远程主机origin的master分支拉取过来,与本地的的testing分支合并 $ git pull origin master:testing # 如果拉取的远程分支与当前分支合并,则可以省略冒号 # 把远程主机origin的 testing 分支拉取过来,与本地的的testing分支合并 $ git pull origin testing #如果本地与远程都做更改了,从远程拉取时要带参数 git pull 远程名 远程分支名:本地分支名 --allow-unrelated-histories
忽略文件
$ cat .gitignore *.[oa] # 忽略所有以.o或.a结尾的文件 *~ # 忽略所有以~结尾的文件