zzGiti学习心得
什么是Git
- Git 是分布式版本控制系统。
- CVS 和 SVN 是集中式的版本控制系统。
- 集中式版本控制系统,版本库是集中存放在中央服务器里,必须联网才能工作。
- 分布式版本控制系统的安全性要高些,每个人电脑里都有完整的版本库,不需要联网。
- 安装 Git 后,使用
git config
配置信息,使用--global
参数,表示该机器上所有的 Git 仓库都使用这个配置。
创建版本库
- 版本库:仓库(repository),可理解成一个目录,Git 管理该目录下所有文件。
- 初始化一个仓库:
git init
把当前的目录变成 Git 可以管理的仓库,空仓库。 - 添加文件到 Git 仓库,两步骤:
- git add file // file 表示文件名,可添加多个 (git add . 匹配所有文件)
- git commit -m "xxx" // xxx 表示提交内容信息,最好有意义,便于查看
查看工作区的状态
-
git status
查看仓库当前的状态。 -
git diff
查看修改内容,如git diff file.txt
查看 file.txt 修改内容。
版本回退
-
git log
显示从最近到最远的提交日志,嫌输出信息太多,可以加上--pretty=oneline
参数。 -
git reset --hard HEAD^
回退上一个版本,HEAD 指向的版本是当前版本,HEAD^
上一个版本,HEAD^^
上上一个版本。 -
git reset --hard commit_id
指定回到未来的某个版本,其中commit_id
表示你要回到未来那个版本的id。 -
git reflog
查看命令历史,记录版本对应的 commit_id。
工作区和暂存区
- 工作区:电脑里能看到的目录。
- 版本库:工作区中有一个隐藏的目录 .git,它就是 Git 的版本库。
- Git 的版本库包括 stage 的暂存区,Git 为我们自动创建的第一个分支
master
,以及指向master
的一个指针HEAD
。 - 使用
git add
只是把文件提交到暂存区,然后使用git commit
命令,才是真正把暂存区的所有内容都提交到当前分支。
管理修改
-
git diff HEAD -- file
可以查看工作区和版本库里面最新版本的区别。 - 每一次修改,必须先使用
git add
提交到暂存区,要不然不会加入到 commit 中。
撤销修改
-
git checkout -- file
把 file 文件在工作区的修改全部撤销。 - 如果使用了
git add
到暂存区,没有 commit,可以用命令git reset HEAD file
把暂存区的修改撤销掉,重新放回工作区;再使用撤销修改命令。
删除文件
- 命令
git rm file
用于删除文件 file。
远程仓库
- GitHub 提供 Git 仓库托管服务。
- 本地 Git 仓库和 GitHub 仓库之间的传输是通过 SSH 加密的。
- 步骤一:创建 SSH Key:ssh-keygen -t rsa -C "steveLau@github.com" (Windows 下打开 Git Bash); 用户主目录里找到
.ssh
目录,里面有id_rsa
(私钥) 和id_rsa.pub
(公钥) 两个文件。 - 步骤二:在 GitHub 里,添加 “SSH Key”,在 Key 文本框里粘贴
id_rsa.pub
文件的内容。
添加远程仓库
- 本地已经创建一个 Git 仓库后,又想在 GitHub 创建一个 Git 仓库,并且让这两个仓库进行远程同步。
- 步骤一:在 GitHub 上新建一个仓库 Git-GitHub,复制SSH:git@github.com:steveLauwh/Git-GitHub.git。
- 步骤二:在本地的仓库下运行命令:
git remote add origin git@github.com:steveLauwh/Git-GitHub.git
,关联远程仓库。 - 步骤三:把本地库的所有内容推送到远程库上:
git push -u origin master
。 - 以后只要本地提交
git push origin master
,就可以把本地 master 分支的最新修改推送到 GitHub。
从远程库克隆
- 远程库已经准备OK,使用
git clone
克隆一个本地库,如:git clone git@github.com:steveLauwh/Git-GitHub.git
。 - Git支持多种协议,包括https,但通过ssh支持的原生git协议速度最快。
从远程库更新到本地库
-
git fetch origin master
//从远程的origin仓库的master分支下载代码到本地的origin master -
git log -p master.. origin/master
//比较本地的仓库和远程参考的区别 -
git merge origin/master
//把远程下载下来的代码合并到本地仓库,远程的和本地的合并
创建与合并分支 (看作指针的移动)
-
master
分支为 Git 主分支,HEAD
指向当前分支。 - 创建 dev 分支,然后切换到 dev 分支上:
git checkout -b dev
;等同于以下两条命令:创建分支git branch dev
和 切换分支git checkout dev
。 -
git branch
列出所有分支,当前分支前面会标有一个*
号。 - 步骤一:
git checkout master
切换回master
分支。 - 步骤二:
git merge dev
将dev
分支的内容合并到master
分支上。 - 步骤三:
git branch -d dev
合并完成后,将dev
分支删除。
解决冲突
- 当 Git 无法自动合并分支时,就必须首先手动解决冲突。解决冲突后,再提交,合并完成。
-
git log --graph
查看分支合并图。
分支管理策略
-
master
分支应该是非常稳定的,仅用来发布新版本,平时不能再上面干活。 - 使用
git merge
命令合并分支时,加上--no-ff
参数,表示禁用Fast forward
,合并后的历史有分支。
Bug 分支
-
git stash
将当前工作现场“存储”起来,等以后恢复现场后继续工作。 -
git stash list
查看工作现场存储位置。 - Git 把 stash 内容存在某个地方,恢复有两个办法:
- 用git stash apply恢复,但是恢复后,stash内容并不删除,你需要用git stash drop来删除
- 用git stash pop,恢复的同时把stash内容也删了
Feature 分支
- 开发一个新 feature,最好新建一个分支。
- 如果要丢弃一个没有被合并过的分支,可以通过
git branch -D 分支名
强行删除。
多人协作 (*)
-
git remote
查看远程库的信息。 -
git remote -v
显示更详细的信息。 -
步骤一:用git push origin branch-name推送自己的修改。
-
步骤二:如果推送失败,则因为远程分支比你的本地更新,需要先用
git pull
试图合并。 -
步骤三:如果合并有冲突,则解决冲突,并在本地提交。
-
步骤四:如果没有冲突或解决,再执行步骤一进行推送。
-
另外,
git pull
提示“no tracking information”,那么使用在本地创建分支和远程分支链接关系没有创建, 使用git checkout -b branch-name origin/branch-name
,本地和远程分支的名称最好一致。
标签管理
- 发布一个版本时,通常先在版本库上打一个标签 tag,这样就可以确定打标签时刻的版本。
- tag 就是一个让人容易记住的有意义的名字,它跟某个 commit 绑在一起。
创建标签
-
git tag <name>
就可以打一个标签。 -
git tag
查看所有标签。 - 找历史提交的commit id:
git log --pretty=oneline --abbrev-commit
。 - 当忘了打标签,找到历史的 commit id,然后使用
git tag <name> commit-id
。 -
git show <tagname>
查看标签信息。 -
git tag -a <tagname> -m "xxxxx"
可以指定标签信息。 -
git tag -s <tagname> -m "xxxxx"
可以用PGP签名标签。
操作标签
-
git push origin <tagname>
可以推送一个本地标签。 -
git push origin --tags
可以推送全部未推送过的本地标签。 -
git tag -d <tagname>
可以删除一个本地标签。 - 先删除本地标签,再
git push origin :refs/tags/<tagname>
可以删除一个远程标签。
使用 GitHub
- 参与各种开源项目。
- 步骤一:在 GitHub 上,可以任意 Fork 开源仓库,然后从自己的账号下 git clone。
- 步骤二:在本地进行修改,利用 Git 推送到 GitHub 上
- 步骤三:在 GitHub 上发起 pull request 给官方仓库来贡献代码。
自定义 Git
-
git config --global color.ui true
命令输出不同颜色。 - 编写
.gitignore
文件的作用是让 Git 忽略特殊文件。 - 所有配置文件可以直接在线浏览:https://github.com/github/gitignore。
-
.gitignore
文件本身要放到版本库里,并且可以对.gitignore
做版本管理。 - 配置别名
- 当前用户的 Git 配置文件放在用户主目录下的一个隐藏文件 .gitconfig 中。
- 每个仓库的Git配置文件都放在.git/config文件中。
在 README.md 中插入图片
在 GitHub 中使用 README.md 文件,这是一个 Markdown 文件,该文件中插入图片是有一定的格式。
https://github.com/用户名/repository仓库名/raw/分支名master/图片文件夹名称/***.png or***.jpg