git 安装: 描述:windows 下载地址:windows git 默认会根据你的电脑下载适合版本类型 流程:双击下载的:Git-2.23.0-64-bit.exe --> 一直点击 Next 就可好(可以更改一下 git 安装路径).
描述:git 已经安装,想升级到最新版本 命令:尝试这两个命令 git update 和 git update-git-for-windows
#查看当前git版本
$ git version
git version 2.20.1.windows.1
#升级git到最新本版 再输入 "y"
$ git update
#升级git到最新本版 再输入 "y"
$ git update-git-for-windows
#查看升级后的git版本
$ git version
git version 2.24.0.windows.1
下载的新版本 git 的安装路径,默认是旧版本的安装地址
命令:
#右击鼠标-->Git Bash Here 输入命令
#配置git用户名:随便起,最好好写成自己的拼音名字,这样提交代码到远程仓库,别人知道是你提交的
$ git config --global user.name "ZhengJa"
#配置git邮箱:邮箱格式要对,不要求邮箱是真的
$ git config --global user.email "953649948@qq.com"
命令演示:
Administrator@ZhengJiaAo MINGW64 ~/Desktop
#git配置用户名
$ git config --global user.name "ZhengJa"
Administrator@ZhengJiaAo MINGW64 ~/Desktop
#查询配置的用户名
$ git config user.name
ZhengJa
Administrator@ZhengJiaAo MINGW64 ~/Desktop
#git配置邮箱
$ git config --global user.email "953649948@qq.com"
Administrator@ZhengJiaAo MINGW64 ~/Desktop
#查询配置的邮箱
$ git config user.email
953649948@qq.com
Administrator@ZhengJiaAo MINGW64 ~/Desktop
#查询git的所有配置信息
$ git config --list
core.symlinks=false
core.autocrlf=true
core.fscache=true
color.diff=auto
color.status=auto
color.branch=auto
color.interactive=true
help.format=html
rebase.autosquash=true
http.sslcainfo=D:/Git/mingw64/ssl/certs/ca-bundle.crt
http.sslbackend=openssl
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
credential.helper=manager
user.name=ZhengJa
user.email=953649948@qq.com
ssh.variant=ssh
git 安装及配置已经完成! (可选)git 客户端安装:sourcetree 官网下载 点击-->Download for Windows
创建一个 demo 文件夹,作为演示的本地仓库。此 git 工作流并没有与远程仓库做关联! 流程:创建文件 test.txt-->添加至暂存区-->将暂存区内容 commit 到本地仓库
命令:
#初始化本版库
git init
#添加文件到版本库,添加某个文件 git add test.txt 添加所有 git add .
git add
git commit -m "提交信息"
#查看仓库状态
git status
命令演示:
Administrator@ZhengJiaAo MINGW64 /j/testfile
#进入一个干净的文件夹-->testfile
$ ls
Administrator@ZhengJiaAo MINGW64 /j/testfile
#创建一个文件夹
$ mkdir demo
Administrator@ZhengJiaAo MINGW64 /j/testfile
#进入刚刚创建的文件夹
$ cd demo
Administrator@ZhengJiaAo MINGW64 /j/testfile/demo
#查看,文件夹中没有任何内容
$ ll
total 0
Administrator@ZhengJiaAo MINGW64 /j/testfile/demo
#初始化git
$ git init
Initialized empty Git repository in J:/testfile/demo/.git/
Administrator@ZhengJiaAo MINGW64 /j/testfile/demo (master)
#查看 可以看出生成了一个 .git文件夹,说明初始化git仓库成功
$ ls -a
./ ../ .git/
Administrator@ZhengJiaAo MINGW64 /j/testfile/demo (master)
#将"git repo" >> 追加进test.txt文件
$ echo "git repo" >> test.txt
Administrator@ZhengJiaAo MINGW64 /j/testfile/demo (master)
#查看test.txt文件内容
$ cat test.txt
git repo
Administrator@ZhengJiaAo MINGW64 /j/testfile/demo (master)
#git 将test文件添加到暂存区
$ git add test.txt
warning: LF will be replaced by CRLF in test.txt.
The file will have its original line endings in your working directory
Administrator@ZhengJiaAo MINGW64 /j/testfile/demo (master)
#git commit 暂存区文件提交到本地本库
$ git commit -m "repo first commit"
[master (root-commit) 3337810] repo first commit
1 file changed, 1 insertion(+)
create mode 100644 test.txt
Administrator@ZhengJiaAo MINGW64 /j/testfile/demo (master)
#查看状态,说明现在都已提交到本地仓库,暂存区是干净的
$ git status
On branch master
nothing to commit, working tree clean
在 git bash 的界面中右击空白处,弹出菜单,选择选项->文本->本地 Locale,设置为 zh_CN,而旁边的字符集选框选为 UTF-8。
英文显示则是: Options->Text->Locale 改为 zh_CN,Character set 改为 UTF-8
工作流图:
创建一个 demo2 文件夹,作为演示的本地仓库。此 git 工作流并没有与远程仓库做关联!
git log --oneline //查看commit提交列表:commit_Id
git log //commit详细信息
流程 1:创建一个文件 demo2_test.txt-->添加文件到暂存区-->将暂存区内容保存到本地仓库
命令:
#初始化git版本库
git init
#将文件添加到暂存区
git add
#将暂存区的文件提交到本地仓库
git commit -m "提交描述信息"
命令演示:
Administrator@ZhengJiaAo MINGW64 /j/testfile
#进入一个干净的文件夹-->testfile
$ ls
demo/
#创建一个文件夹demo2
$ mkdir demo2
#进入刚刚创建的文件夹
$ cd demo2
#查看,文件夹中没有任何内容
Administrator@ZhengJiaAo MINGW64 /j/testfile/demo2
$ ll
total 0
#初始化git
$ git init
Initialized empty Git repository in J:/testfile/demo2/.git/
#添加内容到demo2_test.txt文件
$ echo "第一天需求" >> demo2_test.txt
#查看文件内容
$ cat demo2_test.txt
第一天需求
#查看状态:demo2_test.txt 为红色字体,说明文件还没有添加到暂存区
$ git status
On branch master
No commits yet
Untracked files:
(use "git add <file>..." to include in what will be committed)
demo2_test.txt
nothing added to commit but untracked files present (use "git add" to track)
#将文件添加到暂存区
$ git add demo2_test.txt
warning: LF will be replaced by CRLF in demo2_test.txt.
The file will have its original line endings in your working directory
#查看状态: demo2_test.txt字体变成绿色,说明文件已添加到暂存区,再将文件提交到本地仓库
$ git status
On branch master
No commits yet
Changes to be committed:
(use "git rm --cached <file>..." to unstage)
new file: demo2_test.txt
#将暂存区的文件提交到本地仓库
$ git commit -m "first-commit:新增demo2_test.txt文件"
[master (root-commit) 970eca2] first-commit:新增demo2_test.txt文件
1 file changed, 1 insertion(+)
create mode 100644 demo2_test.txt
#说明暂存区没有文件,且所有修改或添加的文件都已经提交到本地仓库
$ git status
On branch master
nothing to commit, working tree clean
流程 2:修改 demo2_test.txt 文件内容-->将文件到暂存区-->将文件从暂存区移除-->回退修改的文件内容
命令:
#将暂存区的文件移除
git reset HEAD demo2_test.txt
#将文件修改的内容回退,就是让这个文件回到最近一次git commit或git add时的状态,git checkout – filename 可以丢弃某个文件在工作区的改动
git checkout -- demo2_test.txt
命令演示:
Administrator@ZhengJiaAo MINGW64 /j/testfile/demo2 (master)
#向文件追加内容
$ echo "第一天:追加的需求" >> demo2_test.txt
#查看文件内容
$ cat demo2_test.txt
第一天需求
第一天:追加的需求
#查看状态:demo2_test.txt 字体是红色,说明还没有添加到暂存区,将文件添加到暂存区
$ git status
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: demo2_test.txt
no changes added to commit (use "git add" and/or "git commit -a")
#添加文件到暂存区
$ git add demo2_test.txt
warning: LF will be replaced by CRLF in demo2_test.txt.
The file will have its original line endings in your working directory
#查看状态:demo2_test.txt 字体变成绿色,说明文件已在暂存区
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: demo2_test.txt
#将暂存区的文件移除
$ git reset HEAD demo2_test.txt
Unstaged changes after reset:
M demo2_test.txt
#查看状态:demo2_test.txt字体变成红色
$ git status
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: demo2_test.txt
no changes added to commit (use "git add" and/or "git commit -a")
#查看文件内容
$ cat demo2_test.txt
第一天需求
第一天:追加的需求
#将文件修改的内容回退
$ git checkout -- demo2_test.txt
#回退文件修改的内容
$ cat demo2_test.txt
第一天需求
命令:
#查看版本库状态
$ git status
#查看commit日志
$ git log --oneline
#把最近的一次commit撤回到暂存区
$ git reset --soft HEAD^
$ git status
命令演示:
#添加文件并追加内容 "第一次修改"
$ echo "第一次修改" >> demo2_test.txt
#添加到暂存区
$ git add demo2_test.txt
#查看状态:绿色
$ git status
On branch master
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
new file: demo2_test.txt
#commit提交
$ git commit -m "第一次提交文件"
[master 507c25c] 第一次提交文件
1 file changed, 1 insertion(+)
create mode 100644 demo2_test.txt
#查看状态:说明所有暂存区的内容已被提交
$ git status
On branch master
nothing to commit, working tree clean
#查看commit日志
$ git log --oneline
608e471 (HEAD -> master) 第一次提交文件
#把最近的一次commit撤回到暂存区
$ git reset --soft HEAD^
#查看状态:demo2_test.txt颜色绿色,已回退到暂存区
$ git status
On branch master
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
new file: demo2_test.txt
流程 3:修改 demo2_test.txt 文件内容-->将文件到暂存区-->暂存区内容 commit 提交-->回退 commit 提交内容
命令:
#查看日志:commit提交日志
$ git log
$ git log --oneline
#回退commit提交:回到某次commit提交
$ git reset --hard commit_Id
命令演示:
Administrator@ZhengJiaAo MINGW64 /j/testfile/demo2 (master)
#查看文件内容
$ cat demo2_test.txt
第一天需求
#追加内容到文件
$ echo "第二天需求" >> demo2_test.txt
#查看文件内容
$ cat demo2_test.txt
第一天需求
第二天需求
#将文件添加到暂存区
$ git add demo2_test.txt
warning: LF will be replaced by CRLF in demo2_test.txt.
The file will have its original line endings in your working directory
#将暂存区内容commit提交至本地仓库
$ git commit -m "commit:修改demo2_test.txt"
[master a6d8085] commit:修改demo2_test.txt
1 file changed, 1 insertion(+)
#查看日志:commit提交日志,可以看出有两次提交信息,现在想回到之前的“第一天需求”,“第二天需求“不需要了
$ git log
commit a6d8085e0c5e4ad6815c80128eb603132077ca9e (HEAD -> master)
Author: ZhengJa <953649948@qq.com>
Date: Thu Oct 17 12:52:57 2019 +0800
commit:修改demo2_test.txt
commit 970eca211415c4015143895ad1c8585f55298d00
Author: ZhengJa <953649948@qq.com>
Date: Thu Oct 17 11:25:25 2019 +0800
first-commit:新增demo2_test.txt文件:第一天需求
#回退commit提交:回到 ”第一天需求”
$ git reset --hard 970eca211415c4015143895ad1c8585f55298d00
HEAD is now at 970eca2 first-commit:新增demo2_test.txt文件:第一天需求
#查看状态
$ git status
On branch master
nothing to commit, working tree clean
#查看文件内容
$ cat demo2_test.txt
第一天需求
注:
1、git reset 和 git revert 效果一样,但区别很大 git reset :是回退 commit 未推动到远程仓库的版本 git revert :是撤退远程仓库已存在的 commit 版本
命令
git log --oneline //查看 commit 提交列表:commit_Id
git revert HEAD //撤销最近一次提交 git revert HEAD~1 //撤销上上次的提交,注意:数字从 0 开始 git revert 0ffaacc //撤销 0ffaacc 这次提交
命令演示:
#文件追加内容
$ echo "追加的内容2" >> gittest.txt
#查看文件内容
$ cat gittest.txt
追加的内容1
追加的内容2
#添加修改内容到暂存区
$ git add gittest.txt
warning: LF will be replaced by CRLF in gittest.txt.
The file will have its original line endings in your working directory
#commit提交到本地仓库
$ git commit -m "提交:追加的内容2"
[master 37009fc] 提交:追加的内容2
1 file changed, 1 insertion(+)
#将commit push到远程仓库
$ git push
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Delta compression using up to 4 threads
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 354 bytes | 177.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To https://github.com/zhengjiaao/git_test.git
6ee6810..37009fc master -> master
#查看commit历史记录
$ git log --oneline
37009fc (HEAD -> master, origin/master, origin/HEAD) 提交:追加的内容2
7dcf51a 提交:追加的内容1
#撤销最近一次commit,进入编辑状态,英文 ZZ 退出并保存编辑
$ git revert 37009fc
hint: Waiting for your editor to close the file... error: There was a problem with the editor 'vi'.
Please supply the message using either -m or -F option.
#查看文件内容,发现"追加的内容2"内容已经不存在
$ cat gittest.txt
追加的内容1
#将新的版本提交到远程仓库
$ git commit -m "撤销gittest文件 追加的内容2"
[master a13e1ae] 撤销gittest文件 追加的内容2
1 file changed, 1 deletion(-)
#提交到远程仓库
$ git push
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Delta compression using up to 4 threads
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 362 bytes | 181.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To https://github.com/zhengjiaao/git_test.git
37009fc..a13e1ae master -> master
命令:
#删除本地工作区或文件
git rm demo2_test.txt
#提交删除记录 commit
git commit -m "commit:delete demo2_test.txt文件"
命令演示:
Administrator@ZhengJiaAo MINGW64 /j/testfile/demo2 (master)
#查看文件内容
$ cat demo2_test.txt
第一天需求
#查看状态
$ git status
On branch master
nothing to commit, working tree clean
#查看文件个数:1
$ ll
total 1
-rw-r--r-- 1 Administrator 197121 17 10月 17 12:54 demo2_test.txt
#删除本地文件
$ git rm demo2_test.txt
rm 'demo2_test.txt'
#查看本地文件个数:0
$ ll
total 0
#查看状态:demo2_test.txt字体绿色-->本地文件已删除,但是本地仓库中的文件并没有删除,要清空本地仓库的内容,提交删除的记录
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
deleted: demo2_test.txt
#将删除记录commit提交至本地仓库
$ git commit -m "commit:delete demo2_test.txt文件"
[master 85c603f] commit:delete demo2_test.txt文件
1 file changed, 1 deletion(-)
delete mode 100644 demo2_test.txt
#查看状态:说明本地仓库已被清空
$ git status
On branch master
nothing to commit, working tree clean
回顾工作流图:
1、github 添加 ssh keys Github 添加 ssh keys
2、github 新建仓库
根据空白仓库提示执行:
本地已有仓库与远程空白仓库关联 命令:
git remote add <name> url #name:远程仓库地址别名一般为 origin,url:远程仓库地址 git push -u origin master #推送到远程仓库的 master 分支上 -u:是强行推送(用于首次推送,之后推送只需:git push)
命令演示:
Administrator@ZhengJiaAo MINGW64 /j/testfile
#本地创建一个文件夹
$ mkdir local_test
#查看的文件夹
$ ls
demo/ demo2/ local_test/
$ cd local_test
Administrator@ZhengJiaAo MINGW64 /j/testfile/local_test
#追加内容到文件中
$ echo "# git_test" >> README.md
#查看
$ ls
README.md
#初始化git
$ git init
Initialized empty Git repository in J:/testfile/local_test/.git/
#添加文件到暂存区
$ git add README.md
warning: LF will be replaced by CRLF in README.md.
The file will have its original line endings in your working directory
#查看状态:README.md 是绿色说明已存到暂存区,再commit提交到本地仓库
$ git status
On branch master
No commits yet
Changes to be committed:
(use "git rm --cached <file>..." to unstage)
new file: README.md
#将暂存区所有内容提交到本地仓库
$ git commit -m "first commit"
[master (root-commit) c02fd60] first commit
1 file changed, 1 insertion(+)
create mode 100644 README.md
#添加远程仓库:本地仓库与远程仓库关联
$ git remote add origin git@github.com:zhengjiaao/git_test.git
#推送到远程仓库的master分支上 -u:是强行推送(用于首次推送,之后推送只需:git push)
$ git push -u origin master
Enumerating objects: 3, done.
Counting objects: 100% (3/3), done.
Writing objects: 100% (3/3), 219 bytes | 73.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To github.com:zhengjiaao/git_test.git
* [new branch] master -> master
Branch 'master' set up to track remote branch 'master' from 'origin'.
上传文件后 github 效果图:
README.md 文件是我们本地"echo "# git_test" >> README.md"创建的,然后推送到 github 的远程仓库上
描述: 远程已有仓库-这个比较简单 流程:克隆远程已有仓库地址 --> 修改文件内容 --> 将修改内容推送到远程仓库 命令:
#克隆远程已有仓库地址
$ git clone url
#操作:修改文件内容
#将修改内容推送到远程仓库
$ git add
$ git commit -m "commit 信息"
$ git push
命令演示:
Administrator@ZhengJiaAo MINGW64 /j/testfile
#查看文件:有3个文件夹
$ ls
demo/ demo2/ local_test/
#克隆远程已有仓库地址
$ git clone https://github.com/zhengjiaao/git_test.git
Cloning into 'git_test'...
remote: Enumerating objects: 3, done.
remote: Counting objects: 100% (3/3), done.
remote: Total 3 (delta 0), reused 3 (delta 0), pack-reused 0
Unpacking objects: 100% (3/3), done.
#查看:多了一个文件夹 git_test
$ ls
demo/ demo2/ git_test/ local_test/
#进入文件夹
$ cd git_test/
#查看:有一个README.md文件
$ ls
README.md
#向 README.md文件追加内容
$ echo "### 测试k克隆远程已有仓库及推送此内容到远程仓库" >> README.md
#查看状态 :README.md 字体是红色:说明工作区修改后-->还没有添加至暂存区
$ git status
On branch master
Your branch is up to date with 'origin/master'.
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: README.md
no changes added to commit (use "git add" and/or "git commit -a")
#添加 README.md文件到暂存区
$ git add README.md
warning: LF will be replaced by CRLF in README.md.
The file will have its original line endings in your working directory
#将暂存区所有内容commit提交到本地仓库
$ git commit -m "commit: 推送到远程仓库"
[master 44a593d] commit: 推送到远程仓库
1 file changed, 1 insertion(+)
#将本地commit提交的内容 全部推送到远程仓库
$ git push
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Delta compression using up to 4 threads
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 344 bytes | 172.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To https://github.com/zhengjiaao/git_test.git
c02fd60..44a593d master -> master
推送完成看下 github 远程仓库效果:刷新页面
可以看出,我们修改的文件内容已推送到 GitHub 的远程仓库上
在版本库里打个标签,将来在某一时刻想要之前的版本,我们就可以根据标签取出想要的版本. 常用命令:
#查看所有标签名称
$ git tag
#查看标签的详细信息(包含commit的信息)
$ git show tagname
#显示标签名及其描述信息
$ git tag -ln tagname
#创建标签,默认是根据最新的commit打标签,也可以指定某个commit_Id打标签
$ git tag tagname
#指定某个commitId创建标签
git tag tagname commit_Id
#指定提交信息,创建标签同时添加说明信息
$ git tag -a tagname -m "comment"
#切换至指定标签,在某个标签上继续开发
$ git checkout tagname
#退出标签,切换到指定分支即可
$ git checkout branchname
#推送某个标签到远程
$ git push origin tagname
#推送所有尚未推送的本地标签
$ git push origin --tags
#删除本地指定标签 仅删除本地
$ git tag -d tagname
#删除远程仓库的指定标签
$ git push origin -d tag tagname
#获取远程某个标签信息(没有获取代码)
$ git fetch origin tag tagname
选用一个项目测试标签: 进入一个本地仓库:这里选用之前测试用到的 git_test 仓库
Administrator@ZhengJiaAo MINGW64 /j/testfile/git_test (master)
#查看文件
$ ls
README.md
#查看文件内容
$ cat README.md
# git_test
### 测试k克隆远程已有仓库及推送此内容到远程仓库
#向文件追加内容
$ echo "## 标签测试 1" >> README.md
#查看状态:README.md红色 ,工作区修改了文件未添加到暂存区
$ git status
On branch master
Your branch is up to date with 'origin/master'.
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: README.md
no changes added to commit (use "git add" and/or "git commit -a")
#将修改的文件
$ git add README.md
warning: LF will be replaced by CRLF in README.md.
The file will have its original line endings in your working directory
#将暂存区内容提交到本地仓库
$ git commit -m "commit:标签测试1 提交"
[master b1070cb] commit:标签测试1 提交
1 file changed, 1 insertion(+)
#查看状态
$ git status
On branch master
Your branch is ahead of 'origin/master' by 1 commit.
(use "git push" to publish your local commits)
nothing to commit, working tree clean
#推送到远程仓库
$ git push
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Delta compression using up to 4 threads
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 317 bytes | 317.00 KiB/s, done.
Total 3 (delta 1), reused 0 (delta 0)
remote: Resolving deltas: 100% (1/1), completed with 1 local object.
To https://github.com/zhengjiaao/git_test.git
44a593d..b1070cb master -> master
github 远程仓库效果:
创建标签并推送至远程仓库: 命令:
#创建本地标签
$ git tag tagname
#将创建的本地标签推送到远程仓库
$ git push origin tagname
命令演示:
Administrator@ZhengJiaAo MINGW64 /j/testfile/git_test (master)
#查看标签
$ git tag
#创建标签
$ git tag v1.0.1
#查看标签
$ git tag
v1.0.1
#将本地标签推送到github远程仓库
$ git push origin v1.0.1
Total 0 (delta 0), reused 0 (delta 0)
To https://github.com/zhengjiaao/git_test.git
* [new tag] v1.0.1 -> v1.0.1
标签推送到远程仓库成功!
注:当修改的代码没有 commit,也能打标签,但不会将工作区修改的内容打进标签,只有将修改的内容 commit 后才会打进标签中,然后提交标签到远程。
1、工作区修改的代码,没有 commit,也能打标签,但是标签不包含工作区修改的代码 2、工作区修改的代码,commit 保存,可以将修改的代码打进标签,然后推送到远程,远程标签中也存在修改的代码,但若没有 push 本次 commit 信息到远程分支,远程分支是不会有 commit 提交信息
github 查看标签:
删除标签: 命令:
#删除本地指定标签 仅删除本地
$ git tag -d v1.0.1
#删除远程仓库的指定标签
$ git push origin -d tag v1.0.1
命令演示:
Administrator@ZhengJiaAo MINGW64 /j/testfile/git_test (master)
#查看标签
$ git tag
v1.0.1
#删除本地指定标签 仅删除本地
$ git tag -d v1.0.1
Deleted tag 'v1.0.1' (was b1070cb)
#查看标签:发现标签 v1.0.1 已不存在
$ git tag
#删除远程仓库的指定标签
$ git push origin -d tag v1.0.1
To https://github.com/zhengjiaao/git_test.git
- [deleted] v1.0.1
切换到指定标签-->创建新的分支: 命令:
#切换至指定标签
$ git checkout tagname
#退出标签,切换到指定分支即可
$ git checkout branchName
#切换至指定标签,在某个标签上继续开发,开发完成可以创建新的分支
$ git checkout tagname
#这是git的最新版的命令:创建分支并切换至新分支
$ git switch -c branchName
分支操作常用命令:
git branch #显示所有本地分支,
*
是当前分支 git branch -r #显示所有远程分支 git branch -a #显示所有分支(本地和远程)git branch -v #显示本地分支最近一次提交信息 git branch -a -v #显示左右分支最后一次提交信息
git merge <name> # 合并某分支到当前分支
git branch --merged # 已经合并的分支列表,git branch -d 可删除成功 git branch --no-merged # 未合并的分支列表,删除不成功,
-D
选项强制删除它git branch <name> # 创建新分支 git checkout <name> # 切换到指定分支 git checkout -b <name> # 从本地已有的当前分支-->创建新分支->切换至新分支 相当于上面两步操作 git checkout -b dev origin/dev # 从远程已有分支-->创建新分支->切换至新分支,并与远程分支关联 git switch <name> # 切换分支(推荐,但 git 需要升级到最新版本),没有分支不会自动创建 git switch -c dev # 创建并切换新分支或直接切换已有分支上 (推荐,但是 git 需要升级到最新版本)
git merge dev #合并分支
git branch -d dev #删除已经合并的分支,未合并的分支删除不了 git branch -D dev #强力删除分支,会丢掉未合并的内容
Git 鼓励大量使用分支流程:
查看分支:git branch
创建分支:git branch <name>
切换分支:git checkout <name>
或者git switch <name>
创建+切换分支:git checkout -b <name>
或者git switch -c <name>
合并某分支到当前分支:git merge <name>
删除分支:git branch -d <name>
本地仓库的分支创建、合并、删除:
#查看分支
$ git branch
* master
#从当前master创建新分支dev
$ git branch dev
#查看分支
$ git branch
dev
* master
#修改dev分支中test文件内容
$ echo "dev修改文件内容" >> test.txt
#将修改内容添加至暂存区,让git版本库管理
$ git add test.txt
#将暂存区内容提交到本地仓库
$ git commit -m "dev修改text内容"
[dev 7e62af8] dev修改text内容
1 file changed, 1 insertion(+)
#切换至master分支
$ git switch master
#当前master合并dev分支内容
$ git merge dev
Updating 4115cf8..7e62af8
Fast-forward
test.txt | 1 +
1 file changed, 1 insertion(+)
#查看test文件内容
$ cat test.txt
dev修改文件内容
#删除dev分支,必须是已经合并成功,不然删除不掉dev分支,强力删除可以用 -D
$ git branch -d dev
Deleted branch dev (was 7e62af8).
#查看分支
$ git branch
* master
创建本地仓库分支并上传到远程仓库:
#查看所有分支(本地和远程)
$ git branch -a
* master
remotes/origin/HEAD -> origin/master
remotes/origin/master
#新建本地dev分支
$ git switch -c dev
Switched to a new branch 'dev'
#远程没有dev分支,本地有dev
$ git branch -a
* dev
master
remotes/origin/HEAD -> origin/master
remotes/origin/master
#将本地dev分支推送到远程仓库
Administrator@ZhengJiaAo MINGW64 /j/testfile/git_test (dev)
$ git push --set-upstream origin dev
Total 0 (delta 0), reused 0 (delta 0)
remote:
remote: Create a pull request for 'dev' on GitHub by visiting:
remote: https://github.com/zhengjiaao/git_test/pull/new/dev
remote:
To github.com:zhengjiaao/git_test.git
* [new branch] dev -> dev
Branch 'dev' set up to track remote branch 'dev' from 'origin'.
#推送成功 :remotes/origin/dev
$ git branch -a
* dev
master
remotes/origin/HEAD -> origin/master
remotes/origin/dev
remotes/origin/master
删除仓库分支:
git branch -d <branch-name> 删除分支
git push origin --delete <branch-name> 删除远程分支
#查看所有分支
$ git branch -a
* dev
master
remotes/origin/HEAD -> origin/master
remotes/origin/dev
remotes/origin/master
#删除远程仓库分支
$ git push origin --delete dev
To github.com:zhengjiaao/git_test.git
- [deleted] dev
#查看所有分支:发现远程仓库已经没有dev分支
$ git branch -a
* dev
master
remotes/origin/HEAD -> origin/master
remotes/origin/master
#切换到master分支
$ git switch master
Switched to branch 'master'
Your branch is up to date with 'origin/master'.
#删除本地分支,注意dev分支要是已合并的分支,不然删除报错,可以用 -D 强力删除,但会丢失dev开发的代码,所以要先合并分支,再删除分支
$ git branch -d dev
Deleted branch dev (was b1070cb).
#查看所有分支:发现本仓库已没有dev分支
$ git branch -a
* master
remotes/origin/HEAD -> origin/master
remotes/origin/master
###7、远程仓库管理
远程仓库添加、重命名、删除等操作。 命令:
#查看远程仓库别名或路径
$ git remote
$ git remote -v
#删除关联的远程仓库路径
$ git remote rm origin
#添加远程仓库:origin远程仓库别名,url远程仓库地址
$ git remote add origin url
#修改远程仓库别名
$ git remote rename origin oldorigin
$ git remote
oldorigin
#添加多个远程仓库
$ git remote add origin url
$ git remote
oldorigin
origin
本地仓库和远程仓库:
#本地删除远程仓库
$ git remote rm origin
#发现已经没有远程仓库
$ git remote
#添加远程仓库
$ git remote add origin git@github.com:zhengjiaao/git_test1.git
#查看远程仓库
$ git remote
origin
#远程仓库重命名
$ git remote rename origin oldorigin
$ git remote
oldorigin
#添加多个远程仓库
$ git remote add origin git@github.com:zhengjiaao/git_test2.git
$ git remote
oldorigin
origin
多个远程仓库推送和下拉需要指定仓库别名 如:
git pull origin master git pull oldorigin master git push origin master git push oldorigin master
一次推送到多个远程仓库: 上面是不是感觉麻烦,两个远程仓库要推送两次,也可以一次推送到多个远程仓库: 命令:
#url 是第二个(或大于第二个)远程仓库
$ git remote set-url --add origin url
命令演示:
#有一个远程仓库
$ git remote -v
origin git@github.com:zhengjiaao/git_test.git (fetch)
origin git@github.com:zhengjiaao/git_test.git (push)
#添加第二个远程仓库
$ git remote set-url --add origin git@github.com:zhengjiaao/git_test2.git
#查看发现多了一个远程仓库,别名都是origin 一致的
$ git remote -v
origin git@github.com:zhengjiaao/git_test.git (fetch)
origin git@github.com:zhengjiaao/git_test.git (push)
origin git@github.com:zhengjiaao/git_test2.git (push)
一次推送到多个远程仓库 如:
git push origin master
commit message格式说明
Commit message一般包括三部分:Header、Body和Footer。
Header
type(scope):subject
type:用于说明commit的类别,规定为如下几种
feat:新增功能;
fix:修复bug;
docs:修改文档;
refactor:代码重构,未新增任何功能和修复任何bug;
build:改变构建流程,新增依赖库、工具等(例如webpack修改);
style:仅仅修改了空格、缩进等,不改变代码逻辑;
perf:改善性能和体现的修改;
chore:非src和test的修改;
test:测试用例的修改;
ci:自动化流程配置修改;
revert:回滚到上一个版本;
scope:【可选】用于说明commit的影响范围
subject:commit的简要说明,尽量简短
B 是从源 A 上 fork 出来的:
远程(源)A | B fork A | 远程 B |
---|---|---|
pro | pro | |
test | 被删除 | |
test2.5 | 被删除 | |
dev:是 peo 分化出来的新分支 | ||
新增 test2.6 |
本地新建仓库(your_AB) 绑定远程 A 和 远程 B 仓库
#进入your_AB文件夹下,初始化本地仓库
$ git init
#关联多个远程仓库
$ git remote add A https://github.com/zhengjiaao/A.git
$ git remote add B https://github.com/zhengjiaao/B.git
#查看本地仓库关联的所有远程仓库地址,能查到 A和B 说明绑定成功
$ git remote -v
前提:如果没有绑定远程仓库请参考上面 【前提:绑定远程仓库】
#更新远程仓库数据信息到本地仓库your_AB,不是将远程仓库代码下拉到本地
$ git fetch A test2.6
$ git fetch B
#查看 远程仓库分支信息
$ git branch -r
#创建本地分支且关联的远程分支,注:test2.6是A远程仓库上的新增的分支,且B仓库不存在
$ git checkout -b test2.6 A/test2.6
#推送本地分支到远程仓库并在远程仓库创建新分支 ,注:B 为设置的远程仓库别名,第一个test2.6为本地分支名,第二个test2.6为远程分支名
$ git push B test2.6:test2.6
前提:如果没有绑定远程仓库请参考上面 【前提:绑定远程仓库】
#更新远程仓库数据信息到本地仓库your_AB,不是将远程仓库代码下拉到本地
$ git fetch A test2.6
$ git fetch B dev
#创建本地分支且关联的远程分支
$ git checkout -b test2.6 A/test2.6
$ git checkout -b dev B/dev
#切换到本地test2.6分支
$ git checkout test2.6
#查看test2.6分支 commit提交的日志 , 退出日志 英文状态下按Q
$ git log
commit 3c03d1c376ccc8c58d1f232c5e0f57cdeba8df53
Author: Zhengjiaao <1263598336@qq.com>
Date: Tue Oct 15 09:52:46 2019 +0800
your_fork:新增fork9文件
#切换到B_pro分支
$ git checkout dev
#根据提交日志中的 commit Id 合并某次 commit
$ git cherry-pick 3c03d1c376ccc8c58d1f232c5e0f57cdeba8df53
前提:如果没有绑定远程仓库请参考上面 【前提:绑定远程仓库】
#更新远程仓库数据信息到本地仓库your_AB,不是将远程仓库代码下拉到本地
$ git fetch A pro
$ git fetch B dev
#创建本地分支且关联的远程分支
$ git checkout -b pro A/pro
$ git checkout -b dev B/dev
#首先切换到A仓库的 pro 分支
$ git checkout pro
#将dev分支的view文件夹下index.html文件合并到分支pro
$ git checkout B view/index.html
#下拉A
$ git pull A pro
# 推送到A远程仓库
$ git push A pro
git stash 的用法:
要达到的目的是:开发如何保证每次 commit 都是原子性的
开发常见主要场景有:
方式一:
描述:修改 bug 的代码 A 完事后,直接提交,新增功能的代码 B 写完后直接提交
流程:
#在test.java中 修改bug代码A,修改好后
#添加到暂存区
$ git add .
#将修改的代码保存到本地仓库
$ git commit -m "在test.java中 修改bug代码A"
#提交到远程仓库
$ git push
#在test.java中 新增功能的代码B,新增完后
#添加到暂存区
$ git add .
#将修改的代码保存到本地仓库
$ git commit -m "在test.java中 新增功能代码B"
#提交到远程仓库
$ git push
方式二:
描述:同一个文件中 有 修改 bug 代码和新增功能代码,保证每次提交只做一件事(修改 bug 或新增功能)
流程:将 同一个文件修改 bug 和新增功能 代码 保存到堆栈中 --> 将堆栈中代码恢复到当前工作目录 --> 手动删除文件中新增功能代码 --> 将 修改 bug 代码 提交到远程仓库 --> 再次将堆栈中代码恢复到当前工作目录 --> 将 新增功能代码 提交到远程仓库
命令:
#将所有未提交的修改(工作区和暂存区)保存至堆栈中,用于后续恢复当前工作目录
git stash push -m "message"
#拉取最新代码
git pull
#将保存至堆栈的内容 恢复到当前工作目录
git stash apply
具体实现:
#将修和新增功能的文件保存到暂存区,让git版本库管理
$ git add .
#查看状态
$ git status
#将 同一个文件修改bug和新增功能 代码 保存到堆栈中
$ git stash push -m "同一个文件修改bug和新增功能 代码 "
#拉取最新代码
git pull
#查看堆栈中保存的列表
$ git stash list
stash@{0}: On master: 同一个文件修改bug和新增功能 代码
#根据堆栈列表序列 将 “同一个文件修改bug和新增功能 代码” 恢复到当前工作目录
$ git stash apply stash@{0}
#注意:此时,手动删除文件中新增功能代码,仅保留修改bug代码(目的:保证每次commit都具有原子性)
#将 修改bug代码 提交到远程仓库
$ git add .
$ git commit -m "修改bug代码提交"
$ git push
#根据堆栈列表序列 再次将 “同一个文件修改bug和新增功能 代码” 恢复到当前工作目录
$ git stash apply stash@{0}
#将 新增功能代码 提交到远程仓库
$ git add .
$ git commit -m "新增功能代码提交"
$ git push
2.1 修改的 bug 的内容 在不影响新开发接口 A 的情况,也是不存在冲突的情况
命令:
#将所有未提交的修改(工作区和暂存区)保存至堆栈中,用于后续恢复当前工作目录
git stash push -m "message"
#拉取最新代码
git pull
#将保存至堆栈的内容 恢复到当前工作目录
git stash apply
具体实现:
#将A接口功能未完成代码 添加至暂存区,让git版本库管理
$ git add .
#将(暂存区或工作区)内容保存到堆栈中
$ git stash push -m "A接口功能未完成代码"
#下拉新的代码
$ git pull
#注意:这里是 修改bug代码 的操作
#修改bug完成,添加到暂存区
$ git add .
#提交bug修改代码
$ git commit -m "提交bug修改代码"
#将修改内容,提交到远程仓库
$ git push
#查看堆栈中保存的列表
$ git stash list
stash@{0}: On master: A接口功能未完成代码
#根据堆栈列表序列 将 “A接口功能未完成代码” 恢复到当前工作目录
$ git stash apply stash@{0}
#继续开发新的接口A的功能代码
#A接口功能开发完成,将A接口功能提交到远程仓库
$ git add .
#提交新开发的接口A
$ git commit -m "提交新开发的接口A"
#将修改内容,提交到远程仓库
$ git push
2.2 前提:修改的 bug 的内容 会影响新开发接口 A 的情况,存在冲突的情况
命令:
#将所有未提交的修改(工作区和暂存区)保存至堆栈中,用于后续恢复当前工作目录
git stash push -m "message"
#拉取最新代码
git pull
#将保存至堆栈的内容 恢复到当前工作目录
git stash apply
具体实现:
#将A接口功能未完成代码 添加至暂存区,让git版本库管理
$ git add .
#将(暂存区或工作区)内容保存到堆栈中
$ git stash push -m "A接口功能未完成代码"
#下拉新的代码
$ git pull
#注意:这里是 修改bug代码 的操作
#修改bug完成,将修改bug代码 提交到远程仓库
$ git add .
$ git commit -m "提交bug修改代码"
$ git push
#查看堆栈中保存的列表
$ git stash list
stash@{0}: On master: A接口功能未完成代码
#根据堆栈列表序列 将 “A接口功能未完成代码” 恢复到当前工作目录,发现test.txt文件内容有冲突,需要手动解决冲突
$ git stash apply stash@{0}
Auto-merging test.txt
CONFLICT (content): Merge conflict in test.txt
#打开test.txt 文件 查看冲突内容,这时候要手动打开磁盘上文件找到冲突位置解决冲突内容
$ cat test.txt
<<<<<<< Updated upstream
修改bug代码D
=======
新增功能代码A
>>>>>>> Stashed changes
#先冲突解决,再继续开发新的接口A的功能代码
#A接口功能代码开发完成,将A接口功能提交到远程仓库
$ git add .
$ git commit -m "提交新开发的接口A"
$ git push
描述:开发 A、B 两个新接口,同时开发,开发中有操作有相同的文件,但开发完成后提交时,需要保证每个提交 commit 都是具有原子性。
流程:开发 AB 到一半时(或同时完成开发)-->将 AB 同时保存到堆栈中-->再将 AB 恢复到当前工作目录(但堆栈中并不删除)-->将 B 的所有内容删除-->完成 A 接口的功能开发并提交到远程仓库-->将堆栈中 AB 再次恢复到当前工作目录-->删除从堆栈中的拿到的 A 的代码并解决冲突-->再继续开发 B 接口的功能-->提交 B 接口的功能到远程仓库
命令:
#将所有未提交的修改(工作区和暂存区)保存至堆栈中,用于后续恢复当前工作目录
git stash push -m "message"
#拉取最新代码
git pull
#将保存至堆栈的内容 恢复到当前工作目录
git stash apply
具体实现:
#将A、B接口功能未开发完成的代码,添加至暂存区(让git版本管理)
$ git add .
# 将A、B接口功能 未完成代码全部保存到堆栈中
$ git stash push -m "A、B接口功能 未完成代码"
#拉取最新代码
git pull
#将堆栈中保存的 "A、B接口功能 未完成代码" 恢复到当前工作目录(注:堆栈中并不删除 “A、B接口功能 未完成代码”)
$ git stash apply
#注意:此时,手动将恢复的B接口功能的所有代码删除,只保留A接口功能代码(目的:每次commit都具有原子性)
#继续开发A接口功能代码,A接口功能代码开发完成,将A接口功能代码全部提交到远程仓库
$ git add .
$ git commit -m "commit:提交完整A接口功能"
$ git push
#将堆栈中保存的 "A、B接口功能 未完成代码" 再次恢复到当前工作目录(注:堆栈中并不删除),可能会出现冲突,需要手动解决
$ git stash apply
#注意:此时,需手动解决代码的冲突(解决方式:删除所有从堆栈中恢复的A接口功能未完成代码),只保留B接口功能代码(目的:每次commit都具有原子性)
#继续开发B接口功能代码,B接口功能代码开发完成,将B接口功能代码全部提交到远程仓库
$ git add .
$ git commit -m "commit:提交完整B接口功能"
$ git push
注: 每次 commit 都具有原子性: 是说每次 commit 只做一件完整的事情,如,修改一个 BUG 或是完成一个接口功能开发。切记,不能 commit 提交一次包含 "
新增功能
和修改bug
"