GIT使用笔记
GIT的三个代码存储地点
存储地方 | 解释 |
---|---|
暂存区 | 暂时存储代码的地方 git add |
工作区 | 本地仓库(当前分支) git commit |
版本库 | 远端仓库 git push |
GIT的基本命令
功能 | 命令 |
---|---|
克隆代码 | git clone |
初始化仓库 | git init |
切换分支 | git branch 分支名 |
比较差异 | git diff |
查看状态 | git status |
查看日志 | git log |
检出代码 | git checkout |
重置代码 | git reset |
恢复进度 | git stash |
里程碑 | git tag |
回滚操作 | git revert |
获取(不合并) | git fetch |
合并操作 | git merge |
获取并合并(fetch+merge) | git pull |
rebase命令(可以处理冲突和合并提交) | git rebase |
Git clone
- 默认拉取master的代码
$ git clone 项目地址
- 如果要拉取指定分支(例:outside)代码
$ git clone -b outside XXX // "其中outside 就是分支的名称"
不用clone
- 本地新建一个仓库文件夹首先
- 首先 用 git init初始化(.git目录用于Git跟踪管理版本库)
$ git init // "初始化一个空仓库",如果没有.git文件夹,需要用init
- 然后关联远端仓库,执行添加、提交、推远端 之后就可以正常建立分支了
$ git remote add origin https://gitee.com/zhangzg810/gzz-test.git
$ git add .
$ git commit -m "初始化仓库"
- 如果远端仓库不为空,此时push会报错,所以要获取 远程库 并与本地同步合并
- 需要先pull更新代码,才能push,解决上述问题
$ git pull --rebase origin master //"拉取master代码 并合并"
$ git push origin master // "推到远端仓库"
- 如果本地新建了仓库,需要执行完上述push前的所有步骤以后,再把新建文件复制进来,进行push,否则会报错,不过可以使用
git push -f origin master
强制推代码到远端仓库
检查关联的远端仓库
$ git remote -v
---------------------
origin https://gitee.com/xxxxxx/gzz-test.git (fetch)
origin https://gitee.com/xxxxxx/gzz-test.git (push)
删除远端仓库占用
$ git remote rm origin
- 1、Git在当前分支创建新分支
git checkout -b 分支名
- 2、Git把当前分支推到远端仓库
git push origin 分支名
- 3、Git把当前分支关联远端仓库
git branch --set-upstream-to=origin/分支名
新建分支(branch2)以后在别的仓库切换该分支(branch2)的时候,报错找不到该分支
首先
git pull
然后
git checkout branch2 // "就可以找到新建分支了"
分支创建和切换
$ git branch // "显示所有本地分支"
$ git checkout <branch/tagname> // "切换到指定分支或标签"
$ git branch <new-branch> // "创建新分支"
$ git branch -d <branch> // "删除本地分支"
- 分支删除
//"方法一:先删除本地,后删除远程"
git branch -d <branchname>
git push <shortname> --delete <branchname>
例:git branch -d development
git push origin --delete development
//"方法二:推送一个空分支到远程分支,进行删除"
git push <shortname> :<branchname>
例子:git push origin :development
- Git从远程的分支获取最新的版本到本地
"方法1 git fetch 从远程获取最新版本到本地,**不会自动merge**"
git fetch origin master // "从远程的origin的master主分支下载最新的版本到origin/master分支上"
git log -p master..origin/master// "比较本地的master分支和origin/master分支的差别"
git merge origin/master // "最后进行合并"
当有人更改了代码,且提交到了远端仓库,则可以使用git pull获取最新的文件(只能改变被修改了的文件)
"方法2 git pull:是从远程获取最新版本到本地,自动merge"
git pull
git 创建了本地仓库以后,要进行名字和邮箱的设置,否则提交会报错
$ git config --global user.name "Your Name"
$ git config --global user.email "email@example.com"
当然也可以查看你设置的用户名和邮箱
$ git config user.name
$ git config user.email
Git提交文件
- 把当前文件添加到暂存区
$ git add test.html
- 将暂存区的文件提交
$ git commit -m "本次提交的说明"
- 将提交的文件推到远端仓库
$ git push
git add 命令 | 含义 |
---|---|
git add .(这里是个点) | 将工作区的变化提交到暂存区,包括文件修改和新增,但是不包括删除的文件 |
git add -u | 将工作区的变化提交到暂存区,包括文件修改和删除,但是不包括新增的文件 |
git add -A | 将工作区的变化提交到暂存区,包括新增,删除和修改的所有内容 |
git add -i | 将工作区的变化提交到暂存区,进入交互模式选择文件进行操作 |
git add 文件名 | 将工作区的变化提交到暂存区,选定某一个文件进行提交 |
Git合并 主干—>分支(反之换一下顺序就好)
- 切换到master,并更新主干代码
$ git checkout master
$ git pull
- 切换到分支,合并主干代码
$ git checkout 分支名
$ git merge master
- 提交到远端仓库的分支
$ git push
git diff 查看文件被怎么修改的
$ git diff test.html
git status 提交后用 git status 查看一下当前仓库状态
$ git status
On branch master
nothing to commit, working tree clean //"当前没有需要提交的修改,而且,工作目录是干净的"
git log 可以查看一共提交了几个版本的文件
$ git log
commit c2d7a2a893565fc965bd67a0de82691ce6029f97 (HEAD -> master, origin/master, or
igin/HEAD)
Author: zhangzg1 <xxxxx@qq.com>
Date: Mon Nov 23 18:39:51 2020 +0800
test master
commit 68bd3aefa2e95d8e67a65c92902499ab3f57ff44 (origin/release, origin/hotfix, or
igin/feature, origin/develop)
Author: zhangzg810 <8129060+zhangzg810@user.noreply.gitee.com>
Date: Mon Nov 23 17:54:38 2020 +0800
Initial commit
git reset 可以回退文件版本
$ git reset --hard HEAD^ //"HEAD表示当前版本,则HEAD^表示上一个版本,那么上上版本就是HEAD^^ "
HEAD is now at e475afc add distributed
- 1、git commit 只会提交暂存区的文件,如果当前文件没有被加入到缓存区,则执行commit命令无效。
- 2、提交后,可以用 git diff HEAD – readme.txt 命令去查看工作区和版本库里面最新版本的区别。
- 3、git add 以后,没有git commit ,文件暂时在暂存区,但没有提交到分支,用git status查看以后,可以用 git reset HEAD file 把暂存区的修改撤销掉,重新放回工作区
$ git reset HEAD test.html //"git reset命令既可以回退版本,也可以把暂存区的修改回退到工作区,HEAD表示最新版本。"
Unstaged changes after reset:
M test.html
- 4、这时候再丢弃工作区的修改就可以了
$ git reset HEAD test.html //git reset命令既可以回退版本,也可以把暂存区的修改回退到工作区,HEAD表示最新版本。
Unstaged changes after reset:
M test.html
Git merge 和 rebase
$ git merge // "合并后不会删除旧分支,会形成闭环"
$ git rebase // "合并后会删除旧分支,不会形成闭环"
删除文件
$ git rm 文件名 //" 删除文件,并将删除操作提交到暂存区"
$ rm 文件名 //" 删除文件"
撤销修改
修改了文件以后,需要撤回修改信息
$ git checkout -- 文件名 // "抛弃工作区的修改"
$ git status
On branch master
Changes to be committed: // "表示 暂存区有文件"
(use "git reset HEAD <file>..." to unstage)
modified: readme.txt
"首先 撤销暂存区的修改 git reset只对暂存区的文件有效果"
$ git reset HEAD readme.txt //"git reset命令既可以回退版本,也可以把暂存区的修改回退到工作区,HEAD表示最新版本。" "或者使用commit id也可以"
----------------------------------------------------------------------------------------
$ git status
On branch master
Changes to be committed: // "表示 暂存区有文件"
(use "git reset HEAD <file>..." to unstage)
modified: readme.txt
----------------------------------------------------------------------------------------
"然后 抛弃工作区的修改"
$ git checkout -- 文件名 // "抛弃工作区的修改"
----------------------------------------------------------------------------------------
$ git status // " staged 是暂存区"
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: readme.txt //"证明 暂存区是干净的,工作区有修改。"
只有commit以后才会生成版本号
$ git commit 以后执行$ git status
$ git status
On branch master
nothing to commit, working tree clean // "显示暂存区是干净的"
版本回退
$ git log // "查看每一次的commit id"
$ git log --pretty=oneline // "一行一行的显示"
$ git reset --hard commitID // "回退到git log 查看的指定版本"
$ git reset --sort commitID // "只回退commit,如果你想再次提交直接git commit即可,,git reset应该用在私有分支上。"
$ git reset --hard commitID // "彻底回退版本,连本地文件都会被回退到上个版本的内容"
$ git lrevert //"Revert 撤销一个提交的同时也会重新创建一个提交,它不会改变现在的提交历史。因此,git revert可以用在公共分支上"