Git的本地操作 > 参考文献 > * [git使用教程](https://github.com/geeeeeeeeek/git-recipes/wiki) 一个非常详细的中文版git使用详解 本地操作主要是指在同一个仓库中实现版本控制,包括版本的提交、回退等基本擦偶作。 **git安装** - Linux上通过命令行能够很轻松的部署好git - Windows上需要安装GitBash,模拟linux命令行 - 安装完成后需要配置全局信息的命令 \$ git config --global user.name "Your Name" \$ git config --global user.email "email@example.com" 创建版本库 - git init 生成.git文件,将这个目录初始化为一个版本的仓库。 - git add readme.txt 将文件添加到缓冲区,可以连续多次向缓冲区中添加东西 - git commit -m "wrote a message" 将缓冲区的文件提交到历史记录当中当中,可以一次提交对缓冲区的多次修改。 **时光穿梭机** - it status 用来查看当前仓库的状态。主要有changes not staged for commit状态(工作区有变化没有提交),chages to be committed状态(缓存区有变化等待提价) - git diff readme.txt 用来对比工作区和历史记录内容的差别。 **版本回退** - git log 用来查看版本的历史记录 - git log --pretty=oneline 在一行显示历史记录 - git reset --hard HEAD\^ 回退到上一次的历史记录 - git reset --hard id 回退到指定id的版本 - git reflog 用来查看所有操作的历史记录,可以使用reset命令去定位到任何版本 **工作区和暂存区概念理解** - 工作区Wording Directory:在电脑中能够看到的目录,是工作区 - 版本库Repository:工作区有一个隐藏的目录.git是版本库 - 版本库中有Stage暂存区和master等分支以及一个纸箱master的指针HEAD **管理修改** - git跟踪管理的是对文件的修改而并非文件本身 **撤销修改** - git checkout --readme.txt 把readme.txt在工作区的修改全部撤销掉。如果缓存区有readme.txt的中间状态,则从缓存区恢复,如果缓存区没有readme.txt的中间状态,则从版本库中恢复。 - git reset HEAD readme.txt 把readmen.txt在缓存区的修改全部撤销掉。但是依然会保留工作区的修改。 **删除文件** - git rm test.txt 把某个文件从缓存区删掉,然后commit之后会从版本库删掉。如果删错了可以通过checkout从缓存区恢复这个文件。 Git的远程操作 远程操作主要是指,在不同的仓库之间进行提交和代码更改。是一个明显的对等的分布式系统。其中本地个仓库与远程仓库,不同的远程仓库之间都可以建立这种关系。这种关系之间的操作主要有pull和push。 **远程仓库** - 创建SSH key远程仓库和本地仓库一般是通过ssh通信的,需要ssh通信的加密钥匙。 id_rsa是私钥,id_rsa.pub是公钥,可以告诉别人。 ssh-keygen -t rsa -C 'yinkanglong@163.com' - 登录github,添加公钥内容。建立本地与远程仓库的通信协议 **添加远程仓库** - github的界面操作可以很轻松的创建一个远程仓库。但如果想要直接上传自己本地的完整git库,必须创建一个没有lisence和readme的空库。 - git remote add origin git@github.com:michaelliao/learngit.git 将本地仓库和远程仓库进行关联。一般都叫远程关联仓库为origin,本地的主干分支一般名为master - git push -u origin master 将本地的主干分支master推送到远程的origin分支上。-u参数实现了两个分支的关联,将远程的git仓库的master和本地的master进行了分支管理,当再次执行时,只需要使用git push origin master命令。 **从远程仓库克隆** - git clone git@github.com:michaelliao/gitskills.git 分支管理 这里主要体现的git的功能的分离,这才是真正的git吧。每一个分支都是一个单独的可以分离的工作单位。每个用户可以建立不同的分支进行工作,最终提交到同一个开发分支上。一个用户可以建立不同的分支实现不同的功能,最终提交到同一个用户分支上。分支的灵活性,可以让我们很容易的实现不同分工的分割。 **创建分支** - git checkout -b dev 创建分支,并且将工作目录切换到dev的工作目录上。 - git branch dev 使用当前版本分支创建新的分支(即添加一个分支指针)。 - git checkout dev 将工作区切换到某一个分支指针所指的版本上。 - git branch 会列出所有的分支目录。 **分支合并** - git merge dev 将dev分支合并到当前工作目录下的分支上(不一定是产生他的父分支) - git branch -d dev 用来删除一个已经无效的分支指正,但是在这个分支指针上左右的操作都会保留。 **解决冲突** - 当合并过程中出现冲突,会进入长途解决工作区,手动解决后提交,就会退出。 - 关于一点,提交后的分支有必要继续工作吗,都行。完全可以提交后删掉重新创建一个分支,获取主干分支上集成的最新内容,然后继续工作。也可以直接在分支上合并一次主干分支,然后得到最新的内容,继续在原来的分支上进行工作。 - git log --graph 可以查看分支合并图。 **分支合并方式** - git merge --no-ff -m "merge messge" dev \--no-ff 不适用fastfoward方式进行合并,会产生一个新的版本节点。加上-m参数,是因为这种方式合并过程中会自己提交合并后的版本。 **分支管理** - 团队合作的分支管理组图就是你们要的方式 ![clipboard.png](media/202749bd52950c0c839d73190cd2fd9d.png) **BUG分支** - 因为总会在自己工作的过程中出现紧急的需要更改的bug,但是现在工作区中的内容还不能提交,所以必须生成现在工作区的一个快照,等处理完紧急的bug之后,再来回复工作区的内容。 - git stash 将当前的工作现场储存起来,等到修复完成bug之后可以再次进行更改。工作现场包括工作区和stage缓存区。然后可以清空工作区和缓存区的内容,新建bug分支进行工作。 - git stash list 用来查看保存中的工作区。 - git stash apply stash@{0} 恢复stash内容,但并不清楚stash列表中的内容。 - get stash drop 用来删除stash列表中的内容。(因为已经恢复或者没有必要恢复) - git stash pop 可以用来弹出stash列表中的内容。 **Feature分支** - 当添加一个新的功能的时候,因为是一些实验性的代码,所以要创建一个单独的分支进行处理。 - git checkout -b feature-vulcan 创建一个新的功能分支 git status git add vulcan.py git commit -m "add feature vulcan" git checkout dev git merge vulcan.py git branch -D feature-vulcan 不合并,强制删除 多人协作 通过远程库的push和pull操作实现夺人合作 **推送分支或分支内容** - 当从远程库进行克隆的时候,实际上已经将本地master分支和远程的master分支进行乐关联。 - git remote [-v] 可以显示与远程库关联的信息 - git push origin master 推送分支,吧分支上的所有本地内容提交到远程库中的相同分支当中。 - 哪些分支需要推送 mater分支是主分支,需要实时推送 dev是开发分支,所有成员都要在上面工作。也需要与远程同步。 bug分支只需要在本地修复bug,没有必要推送到远程。 feature分支,可以不用推送到远程。单人开发不用,夺人开发要推送到远程。 **抓取分支或者分支的内容** - git checkout -b dev origin/dev 可以用来抓取远程分支dev,这样会建立一个本地的本地的dev分支与远程的dev分支进行关联,可以直接实现dev分支的控制(push) - git pull \ \ 如果Git push失败,说明,当前的版本不是最新的版本。git pull 可以将远程库中的最新版本拉去到本地。 - git branch --set-upstream dev origin/\ 这样会制定git的本地分支与远程的分支之间的链接。 - 如果git pull有冲突,与分支合并中解决冲突的方法一直。 **多人协作的协作模式通常是这样:** > 1\. 首先,可以试图⽤git push origin branch-name推送自己的修改; > 2\. 如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并; > 3\. 如果合并有冲突,则解决冲突,并在本地提交; > 4\. 没有冲突或者解决掉冲突后,再用git push origin branch-name推送就能成功! > 5\. 如果git pull提“no tracking > information”,则说明本地分支和远程分支的链接关系没有创建,用命令git branch > \--set-upstream branch-name origin/branch-name。 标签管理 **创建标签** - git tag v1.0 对当前版本打标签,为v1.0 - git tag 查看所有已经创建的标签 - git tag v0.9 6.225 对指定id的版本打标签 - git show v0.9 查看标签信息 - git tag -a v0.1 -m "version 0.1 released" 3628164 创建带有标签说明的标签 **操作标签** - git tag -d v0.1 删除制定版本的标签 - git push origin v1.0 推送某个标签到远程 - git push origin --tags 一次性推送所有标签。 - git tag -d v0.9 git push origin :refs/tags/v0.9 从远程删除标签,先在本地删除标签,然后将操作推送到远程。 使用github https://www.bilibili.com/video/av10475153/index_2.html\#page=5 这是一个比较啰嗦的讲解github页面的东西,学号英文真的十分重要。 **git的简介** Create Repository 创建仓库 Star 收藏 Fork 复制一份远程仓库 Pull Request 拉我呀,快点,我改好了。 Open & Merge Request 拉你了,别墨迹。 Watch 看着你呢,关注一个项目。 Github主页 仓库主页——仓库相关的信息和相关操作 个人主页 这是一些补充的内容 保持同步 **git remote** - git remote 列出你和远程仓库之间的远程连接 - git remote -v 列出每个连接的名字和url - git remote add \ \ 创建一个新的远程连接并添加名字 - git remote rm \ 移除远程仓库的链接 git fetch - git fetch \ 拉取仓库中的所有分支(包括相关的文件和所有的提交) - git fetch \ \ 拉取制定仓库中的所有分支(包括相关的文件和所欲的提交) \> 注意,这个步骤知识拉取远程的分支,在本地并没有合并也没有生成本地分支,知识一个可读的远程分支。使用 git branch -r 命令可以查看所有只读的远程分支。使用git checkout命令可以创建本地分支,并与远程分支关联。使用git merge 命令可以将远程分支与本地分支合并。 git pull - git pull remote 拉取当前分支对应的远程副本,并将远程副本的更改写入本地副本。相当于git fetch之后git merge。 - git pull -rebase \ 使用git rebase命令合并远程分支与本地分支,不使用git merge git push - git push \ \ 将制定分支推送到远程分支。包括所有的文件和提交。 - git push \ --force 强制推送 - git push \ --all 本地所有的分支推送到远程仓库当中 - git push \ --tags 将本地所有标签推送到远程仓库中