Git学习笔记

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 #查看标签对应commit

  • git tag -a v1.0 -m "..." xxx #标签也可以加上-m

  • git push origin --tags #推送标签到origin

  • git 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
Author: zcp
Reprint policy: All articles in this blog are used except for special statements CC BY 4.0 reprint polocy. If reproduced, please indicate source zcp !
 Previous
正则表达式学习笔记
之前学过一遍正则表达式,结果好久不用基本上忘了,每次用都得重新打开网页搜索下;由于网上讲的参差不齐,还是自己总结下吧。大家都推荐这本书: 精通正则表达式 第3版 1 特殊作用 大写往往代表对小写能匹配的字符取补集 [_a-zA
Next 
新的一年,还是写点什么吧
最近在忙着做presentation的PPT, 当做是这几个月的一个小节吧。接下来还有毕设的任务,到现在还没开始做也是慌得一匹,别人开题都开完了- -不过好在收获也挺多的,也算是体验了一下留学生活吧。日本过年过的是阳历,每年的最后一天叫啥大
  TOC