1 git学习笔记
学习自:
廖雪峰的官方网站
1.1 基础
千万不要使用Windows自带的记事本编辑任何文本文件。原因是Microsoft开发记事本的团队使用了一个非常弱智的行为来保存UTF-8编码的文件,他们自作聪明地在每个文件开头添加了0xefbbbf(十六进制)的字符,你会遇到很多不可思议的问题,比如,网页第一行可能会显示一个“?”,明明正确的程序一编译就报语法错误,等等,都是由记事本的弱智行为带来的。建议下载Notepad++代替记事本。记得把Notepad++的默认编码设置为UTF-8 without BOM
git status / git diff / git log (--pretty=oneline)
工作区–暂存区–HEAD(master…)
HEAD指向master, master指最新的提交,上个版本HEAD^,上上个HEAD^^…
1.2 版本控制
git reset --hard HEAD^
# 回滚到上一个版本 (或:git reset --hard
版本号代码)reset
后只是本地回退到之前版本,若要更新到远程库需要强制推送git push -f
,当前版本之后的commit会全部消失git relog
#记录每一次命令,可用作回到未来版本;git log
可在回退之前版本前用来查看提交历史git checkout -- readme.txt
#丢弃工作区修改,恢复上一版本状态(未add之前用)git reset HEAD filename
# add但未commit用,撤销暂存区内容git rm filename
# 删除版本库文件,若是误删可用git checkout -- readme.txt
恢复
1.3 分支
Github中远程库的名字是origin,
git push -u origin master
#把当前分支master推送到origin, -u 建立本地和远程分支的关联,以后推送可以简化命令。通过ssh支持的原生git协议速度最快。
创建分支dev后,新建了一个指针dev,现在HEAD指向dev,再编辑的话dev前移,master指针不变
git checkout -b dev
#创建并切换到新分支 =git branch dev
+git checkout dev
git checkout -b dev origin/dev
# 创建远程origin的dev分支到本地,本地和远程分支的名称最好一致;建立本地分支和远程分支的关联,使用
git branch --set-upstream branch-name origin/branch-name
git switch -c dev
#创建并切换到新分支(和git checkout -b dev
一样)git branch
#查看当前分支git checkout master
切换HEAD到master分支上 (还可用git switch master
)git merge dev
#合并指定分支和当前分支git branch -d dev
#删除dev分支丢弃一个没有被合并过的分支,可以通过
git branch -D <name>
强行删除。Git用
<<<<<<<,=======,>>>>>>>
标记出不同分支的内容git log --graph --pretty=oneline --abbrev-commit
#查看分支合并情况合并分支时,加上–no-ff参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而fast forward合并就看不出来曾经做过合并。
一般都是在dev上工作,形成版本时发布到master
时刻注意远程分支和本地分支的区别;
git branch -a
查看所有分支,带有remote/origin/xxx
的是远程分支git push origin --delete xxx
删除某个远程分支remote/origin/xxx
1.4 bug处理
git stash
#储存当前工作区,修复bug时用,先新建分支修复bug/git stash pop
恢复工作现场并删除stash /git stash list
查看stash区git checkout master
+git checkout -b issue-xxx
#创建修复bug的分支git switch master
+git merge --no-ff -m "merged bug fix"
#修复完成后删除该分支git cherry-pick xxx
/ 在当前分支重复一遍xxx修改git remote -v
#查看远程库信息git push origin xxx
#推送xxx分支到origin
1.5 标签管理
git tag v1.0
#创建tag,便于管理git tag
查看所有标签git tag v0.9 xxx
#为commit id 为xxx 的操作打标签 /git show v0.9
#查看标签对应commitgit tag -a v1.0 -m "..." xxx
#标签也可以加上-mgit push origin --tags
#推送标签到origingit tag -d v0.9
#标签本地删除 /git push origin :refs/tags/v0.9
#远程删除标签
2 工作流
以下内容更新于2020-02-29 10:12:35
最近用git发现每次忘记的都是同样的场景下那几个同样的命令,所以为了更方便自己及时查阅,按照工作流再总结一遍Git的一些命令。
这里默认用Github作为远程仓库,所以用命令时要时刻注意远程和本地的区别
2.1 git配置
git config --global user.name "xxx"
git config --global user.email "[email protected]"
git config --global core.quotepath false #防止用tab键自动补全的中文文件名被转义
git config --global core.autocrlf false # 不自动转换换行符
git config --global core.filemode false # 忽略文件权限,多人时慎用
git config --global core.safecrlf true # 拒绝提交包含混合换行符的文件
git config --global core.pager cat # 更改Git难受的分页器显示
git config --global core.editor vim #修改ecommit的ditor为vim
git config --global alias.lg "log --color --graph --abbrev-commit --decorate --format=format:'%C(bold blue)%h%C(reset) - %C(bold green)(%ar)%C(reset) %C(white)%s%C(reset) %C(dim white)- %an%C(reset)%C(bold yellow)%d%C(reset)' --all" #让git log 更好看,配置自定义命令 git lg
上述命令是在shell中完成的,如果要检查当前配置可运行git config --list
,或者直接查看配置文件:
vim /etc/gitconfig # 系统上每一个用户及他们仓库的通用配置。 如果使用带有 --system 选项的 git config 时,它会从此文件读写配置变量
vim ~/.gitconfig #(或 ~/.config/git/config):只针对当前用户。 可以传递 --global 选项让 Git 读写此文件。
当然第二项比较常用。
SSH配置:
ssh-keygen -t rsa -C "[email protected]" # Github注册邮箱
vim ~/.ssh/id_rsa.pub # 内容复制添加到github
这样一来自己电脑上存有私钥,github里的是公钥,可以免去每次push输入用户名和密码。
2.2 初始化一个Git(本地和远程同步)
2.2.1 从空的Github仓库clone
这种方法最简单,没什么好说的,git clone
就完事了,配置了SSH的话推荐Clone with SSH
。
之后将本地仓库的文件移动到clone
下来的仓库中,提交一次Github就行了。
2.2.2 关联本地仓库到远程
如果本地已经git init
了一个仓库,并做了很多次修改,现在想上传到Github里,这时候可以关联一个Github的新仓库并push
一次:
cd gitrepository #进入本地仓库文件夹
git remote add origin [email protected]:xxx/xxx.git #还是推荐用SSH地址
# 假设本地已经commit完了
git push -u origin master # 初次push指定远程分支
-u
的作用相当于--set-upstream
,如果你直接不带参数git push
的话Github会提示你:
fatal: The current branch master has no upstream branch.
To push the current branch and set the remote as upstream, use
git push --set-upstream origin master
2.3 移除commit
2.3.1 移除之前所有的commit
这种情况比较少,一般是删了一些文件不想让别人看到,所以commit
也需要清空:
git checkout --orphan latest_branch #新建并切换到一个本地分支
git add -A
git commit -am "delete all of the previous commit messages"
git branch -D master #删除master分支
git branch -m master #重命名当前分支为master
git push -f origin master #强制更新
2.3.2 回滚到之前某个版本
git log #查看想要回滚到的版本代号
git reset --hard CommitID #回滚当前分支到该版本,本地
git push -f #强制更新
2.3.3 删除中间某些commit
这种情况比较复杂;比如发现之前某个版本的改动需要删除,但那个版本之后的改动又需要保留
git log #查看待删除分支之前的那个commit的ID
git checkout -b fixing CommitID #切出来一个新分支
git merge -s ours CommitID_2 #这里的commitID为待删除commit中最新的那一个
# -s : strategy ; ours表示保留当前分支内容,theirs表示保留另一个版本而放弃当前版本
git merge master #再合并CommitID_2后的commit (可能会出现冲突)
2.4 Add与Commit操作
2.4.1 只提交已有文件改动,不新增文件
git commit -a
2.4.2 撤销改动
git reset #撤销add操作
git reset --hard #重置所有改动,至上一commit状态
2.4.3 修改上次commit
已经commit完,发现漏掉文件:
git add files
git commit --amend
先撤销上次commit,但不修改文件:
git reset --soft HEAD^
2.4.4 从仓库中去掉某文件
有时发现仓库里上传了不该传的东西,需要删除:
# 建立一个.gitignore文件,写入忽略的文件名单
# 删除仓库中已有文件
git rm --cached filename #但保留了本地文件
2.5 远程分支
2.5.1 拉取一个远程分支
且当前仓库不存在该分支:
git fetch #同步本地仓库
git checkout test
2.5.2 删除远程分支
git push origin --delete test
# 注意:
git branch -D test #只是删除了本地分支
2.5.3 推送本地新分支到远程
git push --set-upstream origin new_branch