零、常用命令
创建删除分支操作:
git branch -D 分支名:删除本地分支
git push origin --delete 分支名:删除远程分支
git checkout -b 新分支名 origin/master : 基于远程master创建新本地分支
git push --set-upstream origin 远程分支名:第一次push时,要关联一个远程的分支
清空改动代码:
git checkout -- 文件名
清空add的定:
git restore --staged 文件名
清空commit代码:
git reset --hard commitId
删除 untracked files:
git clean -f
回滚错误的代码至远程服务器:
git revert commitId--->git push
修改上一次commit(不会产生新的commitId,但上次的commitID会发生变化):
git commit --amend -m 'recommit'
删除中间某次提交:https://www.cnblogs.com/qiqi715/p/11540999.html
stash操作:
git stash save ""
git stash list
git stash pop
merger操作:
--ff,--no-ff(默认:产生新提交),--ff-only(不产生新提交)
sunxuejian-dev分支merge到master:
1、切到master
2、git pull
3、git merge --squash origin/sunxuejian-dev(让commit变得优雅)
4、git status
5、git log
6、git commit
7、git push
8、git log
rebase操作:
dev分支:git rebase origin/master(变基)--->【遇到冲突--->解决冲突--->git add--->git rebase --continuer】(循环)--->git rebase完毕--->git status--->git push
master分支:git merge origin/dev--->git push
初始化工程
git init
git remote add origin git地址
git add .
git commit -m '说明'
git push --set-upstream origin master
或gitee初始化
1、git clone https://gitee.com/sunxj1222/springCloud-config-study.git ====>用户名 密码
2、git pull
git status:Untracked files
3、git add application.yml
git status:Changes to be committed:
4、git commit -m "application.yml"
git status:Your branch is based on 'origin/master', but the upstream is gone.
或(use "git push" to publish your local commits)
5、git push -u origin master
git status:Your branch is up-to-date with 'origin/master'.
如果报没有权限,则执行:git config --system --unset credential.helper
6、删除文件 rm--->git add -A--->commit--->push
注:git add多个文件
1、多个文件,文件之间以空格隔开:git add file1 file2 file3
2、git add . 提交被修改的和新建的文件,但不包括被删除的文件
3、git add -u --update update tracked files 更新所有改变的文件,即提交所有变化的文件
4、git add -A --all add changes from all tracked and untracked files 提交已被修改和已被删除文件,和新的文件
更新远程分支列表:
git remote update origin --prune
feat: 新功能. (必要的时候请加上 scope: 例如 feat(services): 更新了 XXX )
fix: 修补bug
docs: 文档(documentation)
style: 格式(不影响代码运行的变动)
refactor: 重构(即不是新增功能,也不是修改bug的代码变动)
test: 增加测试
chore: 构建过程或辅助工具的变动
快捷键设置:git log ---->git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"
一、学习
1、git init test --->初始化一个git仓库,会有.git文件夹生成
2、git status --->用于显示工作目录和暂存区的状态,不显示已经commit的信息
Untracked files--->从来没add的文件
Changes to be committed--->已经在stage区,没有commit的文件
Changes not staged for commit---->有修改,还没有加到stage区
Unmerged paths---->merge时冲突的文件,文件内容如下:
$ cat aa.txt
<<<<<<< HEAD
version1_master
=======
version_sunxj1
>>>>>>> sunxj1
3、git cat-file -p hashid--->hashid对应文件存放的内容
blog--->文件的具体内容
tree--->存放blog
commit---->存放parent(上一次的commit)、tree
4、git hash-object 文件名--->计算该文件的hashid
5、git log--->提交历史
6、git branch -a --->显示所有分支
git branch test1.1--->建立本地分支
git branch -D test1.1--->删除本地分支
git push orign master: test1.1---->建立远程分支
git push orign :test1.1--->删除远程分支
git checkout test1.1---->进入分支
git checkout head---->退出分支
7、git ls-files --stage---> 查看暂存区内容
8、git stash save “stash0” ---->将工作区的活index中的暂存到stash0中
git stash pop--->将缓存堆栈中的第一个stash删除,并将对应修改应用到当前的工作目录下
git stash apply---->将缓存堆栈中的stash多次应用到工作目录中,但并不删除stash拷贝
git stash list---->查看现有stash
git stash drop stash的名字---->移除指定的stash
git stash show stash的名字---->查看指定stash的diff,后面添加-p
或--patch
可以查看特定stash的全部diff
--index经暂存的文件重新被暂存
9、git merge test1.1 ---->将当前test1.1分支中的内容合并到当前分支
10、git reset --soft / mixed /hard---->取消提交用到
11、git amend prievious commit ---->修改最后一次提交的内容
12、merge冲突(master|MERGE)、cherry-pick冲突(master|CHERRY-PICKING)、stash pop冲突(master) 。状态如下:
$ git status
On branch master
You are currently cherry-picking commit 633c4fc.
(fix conflicts and run "git cherry-pick --continue")
(use "git cherry-pick --abort" to cancel the cherry-pick operation)
Unmerged paths:
(use "git add <file>..." to mark resolution)
both modified: aa.txt
no changes added to commit (use "git add" and/or "git commit -a")
$ cat aa.txt
<<<<<<< HEAD(当前分支最新提交的节点)
22 我本地的内容
=======
dd 远程分支的内容
>>>>>>> master(master分支)
解决:查看aa.txt ,将要保存的内容add、commit
13、rebase特点
注:
1、当前分支 merge/rebase 分支1--------->将当前分支中的代码做变更,并commit。分支1中的代码不受影响。之后再push就ok了
2、merge/rebase遇到冲突时,对于每个冲突文件进行:vim 编辑文件(内容如上)---> add ---> commit --->push
3、当前分支 git checkout 分支名1 文件名--->将分支1上的文件拉到本地
4、git stash 不针对于哪个分支,是对本地未commit 代码的一个存储,,无论切换到哪个分支上,git stash list都在。。
使用场景:a分支要切换到b分支,但a分支有未add且不想add的代码,这时就要将这部分代码stash存储,否则checkout不到b分支,常用命令:git stash save '名字'、git stash pop (可选:stash@{0})、git stash show、git stash list
注:git stash可以存储未add、已add未commit的代码;不可存储未Untracked files的代码
注:git stash save后,会将workspace中的内容缓存起来,并用版本库内容(commit后的内容)替换workspace中的内容
5、git checkout -b 新分支名 :默认基于当前本地分支创建新本地分支
git checkout -b 新分支名 orign/master : 基于远程master创建新本地分支
git push --set-upstream origin 远程分支名:第一次push时,要关联一个远程的分支,并会在.git目录下生成config文件, 如:
[branch "本地分支名"]
remote = origin
merge = refs/heads/远程分支名
git push origin master:refs/for/master ,即是将本地的master分支推送到远程主机origin上的对应master分支, origin 是 远程主机名,第一个master是本地分支名,第二个master是远程分支名
git push origin f2:f3 :基于本地的f2分支在远程创建f3分支
git push origin :f3 : 删除远程的f3分支
git push origin --delete 分支名:删除远程分支
git branch -D 分支名:删除本地分支
git push origin 本地分支名:将本地分支提交到远程
git branch :查看本地分支
git branch -r :查看远程分支
git branch -a :查看远程+本地分支
常用:
修改了工作区内容,还没add:git checkout -- 文件名 或 git restore 文件名
修改了工作区内容,并add了:git reset HEAD 文件名 或 git restore --staged 文件名
修改了工作区内容,并add、commit了:git reset --hard 版本号(commitId,因为git是分布式版本控制系统)
回退到当前版本:git reset --hard HEAD(当处于merging状态时可以用)
清除Untracked files的文件:git clean -f -d
将多个commitId压缩成一个:git merge --squash origin/dev(让commit变得优雅)
merge模式 | 命令 | 优点 | 缺点 |
fast-forward(默认) | git merge dev --ff | 不会创造一个新的commitId节点 | 不知道是从哪个分支过来的 |
no-fast-forward | git merge dev --no-ff | 知道是从哪个分支过来的 | 会创造一个新的commitId节点 |
6、用 git add 错误的提交了某个文件,就用git reset HEAD 文件名 来取消git add (注:未add是红色,add未commit是绿色)
二、常见场景
1、在A分支上做git pull,B分支也会检测到本地和远程的不同
分支master、A(本地id:1,远程id:2)
master: git pull
提示:A---->origin/A 表示本地A分支和远程A分支存在差异了
master:git checkout A
提示:your branch is behind origin/A by 1 commit 表示本地A分支落后远程A分支一个commit
A:git pull
提示:拉去代码的信息
如图:
2、一般都是在自己的分支上,commit之后push之前执行:git rebase origin/master
三、记一次git rebase
1、背景:在dev分支上开发,合并到master
2、操作:切到dev分支--->git rebase master--->遇到冲突--->解决冲突--->git add--->git rebase --continuer--->遇到冲突--->解决冲突--->git add--->git rebase --continue--->git rebase完毕--->git status(Your branch and 'origin/dev' have diverged,and have 91 and 21 different commits each, respectively.)---> git lg(之前在dev分支上提交的commitId=a,现在commitId=a')--->git pull--->遇到冲突--->git reset --hard(没有参数时,默认为HEAD指向的commitId)--->git push -f--->切到master分支--->git merge dev--->git push
注:rebase与merge的区别
a、rebase时,冲突一个一个提现,遇到冲突会停止,解决后git rebase --continue;merge后,所有冲突一块提现。
b、rebase后,之前在当前分支提交的commitId=a,变为了commitId=a';merge后,会多出一个合并的commitId=b。
dev分支:此时 | dev分支:rebase master后 | dev分支:pull --rebase后 | dev分支:push后 | master分支:此时 | master分支:merge dev后 | master分支:push后 | |
本地commitId | 9d1cf01 | 7b9c1f0 | 9d1cf01 | 9d1cf01git | 8a3f9cd | a80bbe6 | a80bbe6 |
远程commitId | 9d1cf01 | 9d1cf01 | 9d1cf01 | 9d1cf01 | 8a3f9cd | 8a3f9cd | a80bbe6 |
四、记一次pull失败(分支对不上)
$ git pull
error: cannot lock ref 'refs/remotes/origin/guanshujun': 'refs/remotes/origin/guanshujun/fb-3' exists; cannot create 'refs/remotes/origin/guanshujun'
From https://coding.jd.com/app/forcebot2.0
! [new branch] guanshujun -> origin/guanshujun (unable to update local ref)
$ git remote update origin --prune
Fetching origin
From https://coding.jd.com/app/forcebot2.0
- [deleted] (none) -> origin/guanshujun/fb-3
* [new branch] guanshujun -> origin/guanshujun
说明:Git更新远程分支列表