目录
- 廖雪峰git教程学习
- git 使用总结
- git fetch / pull 区别
- git常用命令
- git相关工具
- 配置git使用https方式操作
- 配置gitlab中的SSH key
- 合并多次push的commit
- 提交a分支到远程的b分支
- 对比不同版本之间代码
- 修改未push的commit
- 将在master分支修改的内容切换到refactor分支
- 取消git add的文件
- 取消git commit的文件
- 分支A已经merge到master,之后因其他需求git revert这个merge,然后master有若干merge其他分支操作(最终并不需要这些操作),然后需要再次将A分支(最开始要merge的内容或者还有新内容都)merge到master
- 先后将分支A、B merge到master,之后发现A有问题
- 《Git 学习指南》笔记
- 合并与变基
- 分支模式
- 参考
廖雪峰git教程学习
参考链接:廖雪峰git教程
版本回退:
- git reset --hard HEAD^20
- HEAD之前20个版本
- --hard 撤消commit与对应的更改
- --soft 撤消commit
- git reflog
- 查看操作历史记录
暂存区(stage or index):
-
git add
- 将"文件修改"添加到暂存区
-
git commit
- 将暂存区所有内容提交(移动?)到当前分支
-
git diff HEAD -- a.txt
-
git checkout -- a.txt
- 将a.txt文件在__"工作区"__的修改全部撤销
- 撤销到和 版本库(修改没被放到暂存区)/暂存区(修改已经添加到暂存区) 一样的状态
- 让a.txt回到最近一次git commit/ git add时的状态(会丢失最近一次提交后修改的内容)
- 命令中的"--"
-
git reset HEAD a.txt
- 将__"暂存区"__的修改撤销掉(unstage)
- HEAD 撤销到最新版本
-
引用原作一段话
场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout -- file
场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD <file>,就回到了场景1,第二步按场景1操作
场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交,参考版本回退一节,不过前提是没有推送到远程库
删除:
- rm a.txt
- git rm a.txt (+ git commit)从版本库中删除该文件
- git checkout -- a.txt 恢复误删的a.txt (把误删的文件恢复到最新版本)
- git checkout 用__版本库__里的版本替换__工作区__的版本
远程仓库:
- 本地Git仓库和github仓库之间的传输是通过SSH加密的
ssh-keygen -t rsa -C "xxx@yyy.com
- 新建仓库+推送
- git remote add origin git@github.com:yourname/XXX.git
- 远程库的名字为origin
- git push -u origin master 第一次推送master分支的所有内容
- git push origin master
- 新建仓库+克隆
- git clone git@github.com:yourname/XXX.git
分支管理:
-
概念
- HEAD -> master -> 提交
- 每次提交 master 分支都向前移动一步
-
分支操作命令
- git checkout -b dev
- git checkout master; git merge dev
- git merge 合并指定分支到当前分支
- Fast-forward模式 当删除被合并的分支后,git log中丢掉__是从这个分支合并__的信息
- 禁用--no-ff 禁用后 Git会在merge时生成一个新的commit
- 普通模式合并,能看出来曾经做过合并,git log 中有merge分支的信息
- git branch -d dev
-
带参数的git log
- git log --graph --pretty=oneline --abbrev-commit
- git log --graph
-
stash
- 把当前工作现场“储藏”起来,等以后恢复现场后继续工作
- 从某个分支退出,但不想commit时:
dev分支 git stash git checkout master do some thing git checout dev git stash list git stash pop 或者 git stash applay xxx / git stash drop xxx
-
删除未被合并的分支
- git branch -D XXXX
-
推送/抓取分支
- git push origin dev
- 拉取远程dev分支并创建本地dev分支 git checkout -b dev orgin/dev
- git branch --set-upstream-to=origin/dev dev
- git pull ( git pull origin dev )
标签:
- 概念
- 标签是指向某个commit的指针
- git show
- git tag -a / -d
- 推送标签到远程:git push origin --tags
- 先删除本地标签:git tag -d
- 删除远程标签:git push origin :refs/tags/
或者 git push origin -d
自定义git:
- Git显示颜色
- git config --global color.ui true
- 忽略某些文件
- 快捷键
git config --global alias.st status
git config --global alias.co checkout
git config --global alias.ci commit
git config --global alias.br branch
- 配置文件
$ cat .git/config
[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true
ignorecase = true
precomposeunicode = true
[remote "origin"]
url = git@github.com:michaelliao/learngit.git
fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
remote = origin
merge = refs/heads/master
[alias]
last = log -1
git 使用总结
git fetch / pull 区别
- 参考文献
- 区别在于取回更新后是否自动合并
- 概念
- tracking (分支)追踪关系
- git branch --set-upstream master origin/erp01
- 指定master分支追踪origin/erp01
- git pull <远程主机名> <远程分支名>:<本地分支名>
- git pull origin erp01:master
- 取回origin主机的erp01分支与本地的master分支合并
- git push <远程主机名> <本地分支名>:<远程分支名>
- git pull origin erp01:master
- 取回origin主机的erp01分支与本地的master分支合并
git常用命令
- 更新代码
- git fetch --all (fetch all remotes)
- git push origin remotes/upstream/master:master -f
- 将fetch下来的remotes/upstream/master分支push到origin远程仓库master分支上,省略了merge的commit
- git branch -va查看fetch后的结果
- git reset --hard HEAD~20
- git checkout master
- git pull (将最新代码拉取到本地)
- 需要保存未提交的内容
- git format-patch用法
- git format-patch -
- git commit --amend --no-edit
- 还原某个特定文件到某个版本
- git checkout commit-id xxx.cpp
git相关工具
- tig
配置git使用https方式操作
- 配置避免每次都输入username / passwd
- 参考https://www.cnblogs.com/kb342/p/5566793.html
git config --global user.name "username"
git config --global user.email "useremail"
git config --global http.sslverify "false"
vi ~/.git-credentials #添加https://username:passwd@addr.com<:port>
git config --global credential.helper store
配置gitlab中的SSH key
cd ~; ssh-keygen -t rsa -C "your_email@youremail.com"
cat /Users/admin/.ssh/id_rsa.pub
- 将公钥粘贴到gitlab-setting-SSH keys中
- 但git clone git@.....git发生错误(可能由于服务器未开放22端口)
tmp $git clone git@XXX.com:WWW/YYY.git
Cloning into 'YYY'...
ssh: connect to host XXX port 22: Operation timed out
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.
- 添加如下配置
tmp $cat ~/.ssh/config
Host gitlab
Hostname XXX
Port 8021
User git
tmp $cat /etc/hosts
##
# Host Database
#
# localhost is used to configure the loopback interface
# when the system is booting. Do not change this entry.
##
127.0.0.1 localhost
255.255.255.255 broadcasthost
::1 localhost
10.120.16.22 XXX
10.120.16.22 gitlab
合并多次push的commit
- git rebase -i HEAD~3
- git status
- git push origin master -f
- git status pop
提交a分支到远程的b分支
- git push origin b:a
- 参考git 推送本地分支到远程分支 git push origin
对比不同版本之间代码
- git reflog
- git diff old_commit_id new_commit_id
修改未push的commit
- git commit --amend
将在master分支修改的内容切换到refactor分支
- git stash
- git checkout refactor
- git stash pop, 这一步会发生冲突,产生需要解决冲突的文件,但此时并没有执行git stash drop,所以可以执行如下步骤
- git checkout master -f
- git pop,此时恢复到了最初的在master上完成开发的状态
- git stash
- git pull origin master
- git checkout refactor
- git merge master
- git stash pop
取消git add的文件
- git reset HEAD a.cpp
- git reset HEAD . 取消所有add的文件
取消git commit的文件
- git reset --soft HEAD~1
分支A已经merge到master,之后因其他需求git revert这个merge,然后master有若干merge其他分支操作(最终并不需要这些操作),然后需要再次将A分支(最开始要merge的内容或者还有新内容都)merge到master
- 首先最后一步的merge request中只包含新内容,丢失了分支A最开始要merge的内容
- 这种情况下需要在master分支执行 git revert
,这时A分支最开始要merge的内容已经回来了,然后执行git push origin master,再将A分支的新内容提merge request - git revert -m 1
参考 https://stackoverflow.com/questions/5970889/why-does-git-revert-complain-about-a-missing-m-option
先后将分支A、B merge到master,之后发现A有问题
- 先将已merge的B分支revert
- 然后在A分支做修改,再次提交merge request并merge
- cherry pick 后来merge的B分支并merge
《Git 学习指南》笔记
git仓库的三个概念
工作区 working tree/working directory
- 用户的增删改发生在工作区
- git status查看当前工作区中所发生的修改
暂存区 index/staged snapshot
- 又叫缓存区、索引
- git add 将增删改注册到暂存区
- git add -i 中选择patch,然后选择e可以按行将修改注册到暂存区,有关manually edit the current hunk,可以参考 edit-your-hunk
- 主要是要修改header部分如:@@ -9,6 +9,12 @@,它代表原来是从第9行开始后面6行,现在从第9行开始后面12行,才到达相同内容的行,如果这个hunk全部提交就是这样,如果只提交一部分,那就要相应修改+后面的行数
版本库 commit history
- git commit 将暂存区中的修改传送到版本库
常用git命令
git diff <a.cpp>
- 不带任何选项的情况下,显示的是 暂存区 与 工作区 之间的不同
- 加上 --staged,显示 当前版本库中HEAD提交 与 暂存区 之间的不同
git reset
- 操作 commit
- reset (--mixed) commit
- 将 index 和 commit history 重置为commit版本 - reset --soft commit
- 将 commit history ...... - reset --hard commit
- 将 working dir 和 index 和 commit history ......
- reset (--mixed) commit
- 如果修改了 commit history,提交到远程分支可能会报错,因此 reset 通常用来恢复本地的修改与提交
- 修改commit history 即修改HEAD指针
- 操作 file
- reset commit file
- 将 index 中 file 更新为 commit 版本的 file
- reset commit file
git checkout
- 操作 branch
- 操作 commit
- 会覆盖 working dir 和 index 和 commit history 中的文件
- detached HEAD
- 待补充 - 操作 file
-checkout commit file
- 将 working tree 中 file 更新为 commit 版本的 file
git revert
- 会生成新的 commit,恢复后的代码,可以直接提交到远程分支,通常用来恢复远程的提交
- 只可操作 commit
- You can also think of git revert as a tool for undoing committed changes, while git reset HEAD is for undoing uncommitted changes
- 会覆盖 working dir 和 index 和 commit history 中的文件
git stash
- 将 工作区 和 暂存区 中的修改保存在 储藏栈(stash stack) 中
- git stash save "at a.cpp"
- git stash show -p stash@
合并与变基
分支模式
Git-Flow模式
Github-Flow模式
Gitlab-Flow模式
待补充
参考
Resetting, Checking Out & Reverting
What's the difference between git reset --mixed, --soft, and --hard?
https://git-scm.com/docs/git-reset
Merging vs. Rebasing
Git 分支 - 变基
如何选择 Git 分支模式
git http方式免密提交