Git基础

2018-08-30  本文已影响0人  陈_振

本文记录一些学到的Git相关的基础操作

Git Documentation

Git 相关的一些基本概念

0.jpeg

图片来源:廖雪峰的官方网站

工作区:电脑中能看到的目录,这里git-learning文件夹就是一个工作区

stage:暂存区

.git:这个不算工作区,而是Git的版本库

Git的配置

查看Git相关的用户名和邮箱

git config user.name
git config user.email

修改用户名和邮箱(或初始化时配置用户名和邮箱)

git config --global user.name "CZ" // 也可以不加双引号

git config --global user.email "1229383755@qq.com"

创建第一个Git仓库

git init

该方法执行后会在当前目录下创建一个隐藏的.git目录(Git的版本库),用来跟踪版本信息


Screen Shot 2018-09-23 at 11.00.09.png
mkdir git-learning
cd git-learning

// 该方法执行后会在git-learning目录下创建一个隐藏的.git目录(Git的版本库),用来跟踪版本信息
git init

// 在git-learning目录下新建一个文件,模拟在项目中添加了内容
touch helloGit.txt

git status

此时,helloGit.txt保存在工作区,Git还没有登记这个文件。可以通过命令git status查看文件的状态

Screen Shot 2018-09-23 at 13.17.41.png

git add

执行git add helloGit.txt,将当前文件的当前状态添加到stage区,相当于给该文件添加了快照。

此时执行git status,会显示Changes to be committed,说明文件已经在stage区。

Screen Shot 2018-09-23 at 14.07.28.png

git commit

git commit提交更改,实际上就是把stage区的内容提交到当前分支
使用git commit或者git commit -m "提交相关的一些说明",此处我执行的命令是git commit -m "Add txt secondly"

git log

此时执行git log可以看到之前的两次提交结果。每次提交都会生成对应的Hash value,head表示分支的当前位置,head->master表示我们在当前的master分支上。

Screen Shot 2018-09-23 at 14.12.25.png

如何修改已经完成的提交

情景描述:小i刚进行了一次commit,突然发现有一段代码写错了。如何处理这种情况?

使用git log查看提交记录如下图

Screen Shot 2018-09-23 at 16.06.02.png

在最新的一次提交中发现代码有一处拼写(Git写成iGt)错误:


Screen Shot 2018-09-23 at 16.09.48.png

此时,如果已经将错误的代码push线上的代码仓库,则只能将错误代码修正后重新addcommit

如果只是在本地使用和管理代码,可以使用以下几种方案:

  1. git reset --soft

通过git log命令找到“change the content”的上一次提交,然后复制一下这个ID(hash value)。回到终端,执行git reset --soft 186e17b265a6b9c1d2bf35d6de24373f18441149

执行完这句命令后,git库会更新到指定的这次提交,并且不会改变你工作区中的内容,同时将更新之前的内容copy到stage区。使用git loggit status命令查看如下图:

Screen Shot 2018-09-23 at 16.30.29.png Screen Shot 2018-09-23 at 16.30.59.png

打开源文件,修改错误的地方。此时,工作区和stage区内容不一致。使用git status查看:

Screen Shot 2018-09-23 at 16.35.14.png

接下来执行git add .(该命令表示将所有修改过的文件提交到stage区)和git commit -m "change the content"

到此,错误的提交就已经被修改过来了。

可以使用git log查看。

  1. git reset --hard

使用git reset --hard前工作区的内容为“hello iGt!!“。如下图:

Screen Shot 2018-09-23 at 16.42.37.png

此时执行git reset --hard 186e17b265a6b9c1d2bf35d6de24373f18441149
后,git库将会更新到你指定的ID,同时工作区(即本地代码)也会被同步更新到上提交的内容(被修改为"hello Git!")。见下图:

Screen Shot 2018-09-23 at 16.47.17.png

所以要慎用hard

  1. git commit --amend
    直接将更正后的内容恢复到之前的提交中。

打开文件编辑,更正之前的错误并保存,然后执行git commit --amend。之后会弹出最近一次提交的日志,可以根据需要决定是否需要修改提交日志的内容(一般是不需要修改,直接:wq保存退出)。

在项目中使用分支

为什么要使用分支?

情景描述:
小i的开发团队只有一个分支-master。此时,他正基于master分支进行postAPI的开发,post正写到一半,突然有人反馈说requestAPI无法访问,需要立即修复。如下图。错误原因是因为request被误写成requets。此时如果直接修改为request,并执行addcommit操作,那么便会将未开发完成的postAPI提交上去,显然我们不该这么做。此时,该怎么办?

Screen Shot 2018-09-24 at 01.59.37.png

使用分支来解Bug和开发需求

git checkout -- <file>

基于上述情况,我们只能撤销掉master分支上在最后一次提交之后的所有修改。

执行git checkout -- vapor/ViewController.m。执行后的结果如下图:

Screen Shot 2018-09-24 at 02.10.19.png

git branch

用于创建一个新的分支。分支的名称要反应分支的用途,一般开发功能叫做feature-<功能名>,修复Bugbug-<ID>,如果是issueissue-<ID>

我们此时开发postAPI,应进行如下操作:

// 创建分支
git branch feature-post

// 切换分支到feature-about
git checkout feature-about

或者直接执行git checkout -b feature-about

Screen Shot 2018-09-24 at 02.19.01.png Screen Shot 2018-09-24 at 02.20.52.png

此时,如果接到紧急修复requstAPI的Bug,先将feature-post分支上的代码commit,创建一个修复Bug的分支(当然这里可以直接切换到主分支直接进行修改并commit)。切换后代码变化见下图:

Screen Shot 2018-09-24 at 02.36.24.png

feature-post分支上写的代码不见了。就应该如此。基于bug分支,我们直接修改request。修改完毕后,切换到主分支。

git merge

执行merge操作。此时一定要确保在主分支上。

// --no-ff参数,在历史记录中明确记录下本次分支合并。
git merge --no-ff bug-request


git merge bug-request

效果见下图:


Screen Shot 2018-09-24 at 02.43.57.png

git branch -d <分支名>

此时Bug已经修复,可以删除bug-request分支。

git branch -d bug-request

然后可以切换到feature-post分支进行开发,完成后切换到主分支进行merge。(merge后不需要执行add和commit)。

使用Git别名

git config --global alias.<别名> <原名称>

git config --global alias.s status
Screen Shot 2018-09-24 at 03.02.34.png

vi ~/.gitconfig

查看git的配置

Screen Shot 2018-09-24 at 03.04.07.png

使用stash缓存代码修改

当你在某个分支上进行开发时,如果要紧急切换回master修复BUG,则可以先在当前分支上提交,之后切换分支,修复BUG并提交,然后,切换回功能分支继续开发。当然,这只是一个理想的情况,现实中,有很多时候,我们的代码还不具备提交条件,面对这种情况,该怎么办呢?

先介绍一种较为麻烦的方法:

将当前feature分支先commit并备注"WIP"(work in process),切换到主分支修改完Bug后,切回feature分支,同时查看git log,reset到最后一次提交的上一次提交。

第二种实用git stash

git stash

先在当前feature分支执行

git stash

git stash apply stash@{0}

然后切换到主分支进行操作,完成后切换到feature分支,执行如下操作:

git stash apply stash@{0}

此时,之前的内容被恢复过来。可以接着进行开发。

git stash drop stash@{0}

手工清除“缓存记录”。

把stash推到新分支上

feature分支的代码stash后,切换回主分支,此时由于不小心将feature分支删除了。此时该怎么办?

git stash list

在主分支中执行

// 查看缓存记录
git stash list

// 把缓存的内容先恢复到master分支上
git stash pop

// 然后重新执行git stash,这时,就是对master分支上的“缓存”了
git stash

// 用缓存的内容创建并切换到feature-post分支
 git stash branch feature-post

目前的这些总结是Git中非常基础的一部分,但对我来说,在目前的工作中已经够用了,待到日后有时间或者工作需要更进阶的使用,我再去学习总结。文中有错误的地方,欢迎指正,共同学习。

参考文章:
Git

通过GitHub分享代码

Screen Shot 2018-10-14 at 19.15.48.png

如果要把本地的项目直接推送到GitHub,就不要选中Initialize this repository with a README选项,否则GitHub就会直接创建一个空项目。

点击Create repository:

Screen Shot 2018-10-14 at 19.23.14.png

第一个适用于新创建的项目:
前四行代码是为了创建并commitREADME.md文件。第五行代码是为了将GitHub分配给我们的项目地址添加到项目的一个远程来源,并把这个来源命名为origin。最后一行代码是将本地项目推送到远程来源。-u表示upstream

在GitHub创建和处理PR

如果我们想给别人的开源项目贡献代码,需要进行Pull Request。

Screen Shot 2018-10-14 at 19.50.23.png

第一:在你想要贡献代码的项目主页,点击右上角的Fork,这时会在你的GitHub上Clone一个副本。如下图所示:

Screen Shot 2018-10-14 at 19.53.00.png

第二:此时我们点击右上角的Clone,复制一下项目地址,将其Clone到本地chuchu2文件夹下。操作如下:

Screen Shot 2018-10-14 at 19.58.01.png

第三:然后cd到chuchu2文件夹后,执行如下命令(1. 清空保存的认证信息 2.配置Git用户名和邮箱3.编辑文件并commit4.)

Screen Shot 2018-10-14 at 20.46.16.png Screen Shot 2018-10-14 at 20.49.25.png

第四:回到项目首页,点击new pull request按钮

Screen Shot 2018-10-14 at 20.56.18.png

第五:点击左上角Create pull request按钮

Screen Shot 2018-10-14 at 20.57.55.png

第六:点击Create pull request

Screen Shot 2018-10-14 at 21.12.24.png

Rebase Code

merge后的:
红色是master分支,绿色是feature分支,星号表示在某个分支上的具体操作(左侧的星号表示在master分支的操作)。


Screen Shot 2018-10-14 at 21.39.10.png

但有时,我们创建分支仅仅是为了不影响master,并没有必要在master的提交记录上看到这个创建分支的过程,因为分支的创建有可能会很频繁。这时,我们就可以使用git rebase命令。

通过rebase简化提交记录

切换到feature分支,commit后,执行git rebase master。然后切回到master分支,执行git merge feature。此时feature的提交记录就合并到master分支上了。如下图:

Screen Shot 2018-10-14 at 21.51.40.png

记录最近比较常用到的操作

基于远程分支创建分支

git checkout -b <要创建的分支名> <远程库名>/<远程分支名>

eg:
git checkout -b feature_a origin/dev

查看远程分支

git branch -r

// 查看本地分支加远程分支
git branch -va

pull远程分支

git pull <远程库名> <分支名>
eg:
 git pull origin dev

fetch远程分支

git fetch <远程库名> <分支名>
eg:
 git fetch origin dev

基于本地分支创建远程分支

   git push origin <本地分支名>:<新创建的远程分支名>

查看当前的本地分支与远程分支的关联关系

git branch -vv

关联本地分支与远程分支

git branch --set-upstream-to=[远程分支名]
eg:
git branch --set-upstream-to=origin/feature_scanner

为本次提交打tag

git tag <标签名>
git push --tags

eg:
git tag v1.3.2
git push --tags

将之前连续的几次commit合并为一次commit
此操作的前提是这几次commit操作均没有push到远端。

image.png

如上图所示,我想要将d5d4167之前的commit合并为一次commit,因此,执行如下操作

git rebase -i d5d4167

然后在新弹出的编辑框中将除第一行的commit message 中的信息开头改为s,然后保存退出。这时会新弹出一个编辑框,可以为合并的这几次commit写一个总结commit message。

将指定的commit的内容复制到当前分支中

比如当前在B分支,但是我想将A分支的某几次commit合并到B分支,则可以如下操作:

git cherry-pick <commit-id>
git cherry-pick <start-commit-id>...<end-commit-id>  //(左开,右闭] 即不包括<start-commit-id>
git cherry-pick <start-commit-id>^...<end-commit-id>  //[左闭,右闭] 即也包括<start-commit-id>

极客时间Git学习记录

git mv

更改文件名

// 将readme重命名为readme.md
git mv readme readme.md  

git commit -m "Change readme to readme.md"

git log

显示当前分支的记录

git log --all

显示所有分支的记录

git log --all --graph

图形化的形式显示所有分支

git log -n2/git log --oneline --all -n2/...

查看最近两次的提交。

git checkout [comit_id]

可以基于某次commit分离头指针,在HEAD detached from comit_idcommit的记录不会被git作为分支记录,如果此时切换回其他分支,那么在分离头指针上的操作有可能被丢弃。除非通过git branch [new-branch-name] [commit-id]显示为分离头指针创建一个分支。

查看不同的提交或者不同分支上的提交的差异

git diff [commit-id-one] [commit-id-another]

该指令也可以比较不同分支commit-id的差异

也可以使用git diff HEAD HEAD~1 比较当前分支commit和上次commit。

修改最新的commit message

git commit --amend

修改老旧的commit message

git rebase -i [需要调整的commit的parent commit id]

把将要修改的commit前的pick改为reword或者r。

把连续的多个commit整理成一个

git rebase -i [需要调整的commit的parent commit id]

把将要合并的commit前的pick改为squash或者s。

比较HEAD和暂存区所含文件的差异

git diff --cached

比较工作区和暂存区所含文件的差异

// 比较工作区和暂存区所有文件的差异
git diff  

// 比较工作区和暂存区指定文件的差异 (--后有空格)
// 可以指定多个文件
git diff  -- 文件名(需包含完整路径)
eg:
// 指定单个文件
git diff -- Model/StackModel.m

// 指定多个文件
git diff -- Model/StackModel.m styles/style.css



恢复暂存区所有文件和HEAD一样

git reset HEAD

恢复暂存区指定文件和HEAD一样

git reset HEAD 文件名

git reset HEAD 文件1 文件2 ... 文件n

总结:
reset指令变更暂存区内容-恢复暂存区和HEAD一样

checkout指令变更工作区内容-恢复工作区和暂存区一样

消除最近的几次commit

git reset --hard [commit-id]

该指令会更改head指针,同时更新暂存区和工作区

正确删除文件的方法

git rm [文件名]

该操作会删除本地文件,同时将删除的状态更新到暂存区。

开发中临时加塞了紧急任务

// 该指令会将暂存区和工作区的内容缓存起来,并更新工作区和暂存区的内容与最新的提交保持一致
git stash

// 当紧急任务完成并且提交之后,执行如下指令,会将缓存的内容同步到工作区
git stash pop 或者
git stash apply

指定不需要Git管理的文件

.git所在的目录下添加.gitignore文件。
有如下几点需要注意:

假如要忽略doc文件夹下所有文件,可以在.gitignore文件中输入doc。但此时如果.git所在的目录下有一个名为doc的文件,则也会被git忽略。如果不想将该文件被忽略,只是忽略doc文件夹下的所有文件,则将.gitignore文件中的doc改为doc/即可。

如何将Git仓库备份到本地

  1. cd 到备份文件夹下,例如backup/
  2. 在backup目录下执行 git clone --bare file://[待备份路径/.git],例如:git clone file:///Users/cz/desktop/git_learning/.git(--bare表示clone裸仓库,不带工作目录。file://前缀代表采用智能协议。如果不带file://的话说明是采用哑协议,哑协议clone时没有进度显示)。执行完该步骤之后即备份成功,然后在终端中回到待备份目录,/Users/cz/desktop/git_learning/
  3. git remote add [远端仓库别名] [备份路径/.git],例如 git remote add remoteRepo file:///Users/cz/desktop/git_learning/.git
  4. git push --set-upstream [远端仓库别名] [当前分支名],例如git push --set-upstream remoteRepo master(假设当前在master分支)
  5. 以后push时只需执行git push [远端仓库别名]

git remote -v 查看备份仓库
git branch -av 查看本地和远端分支

上一篇下一篇

猜你喜欢

热点阅读