github常用操作

1. 设置SSH Key

GitHub上连接已有仓库的认证,是通过使用的SSHDE公开密钥认证方式进行的. 运行一下命令创建SSH Key

ssh-keygen -t rsa -C "your_email@example.com"

在GitHub中添加公开密钥,今后就可以用私有密钥进行认证了

$ cat ~/.ssh/id_ras.pub
ssh-rsa 公开密钥的内容 your_email@example.com

2. 基本操作

git init 初始化仓库 :

通过git init命令把这个目录变成Git可以管理的仓库。当前目录下多了一个.git的目录,这个目录是Git来跟踪管理版本库的,没事千万不要手动修改这个目录里面的文件,不然改乱了,就把Git仓库给破坏了。
如果你没有看到.git目录,那是因为这个目录默认是隐藏的,用ls -ah命令就可以看见。

git status 查看仓库的状态
git add 向暂存区中添加文件 ,git commit 保存仓库的历史记录

这里写图片描述

  • 要想让文件成为Git仓库的管理对象,就要使用git
    add命令将其加入暂存区(stage),文件状态此时变为staged,暂存区是提交之前的一个临时区域。

  • git commit命令可以讲暂存区的文件实际保存到仓库历史记录中,通过这些记录,可以在工作树中复原文件。

    第一步是用git add把文件添加进去,实际上就是把文件修改添加到暂存区;
    第二步是用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支。
    因为我们创建Git版本库时,Git自动为我们创建了唯一一个master分支,所以,现在,git commit就是往master分支上提交更改。
    你可以简单理解为,需要提交的文件修改通通放到暂存区,然后,一次性提交暂存区的所有修改。

git log 查看提交日志
  • 如果想要查看这次还没add (unstaged) 的修改部分 和上个已经 commit 的文件有何不同, 我们将使
$ git log
$ git log --pretty=short 只显示提交信息的第一行
$ git log README.md 只显示指定的目录,文件和日志
$ git log --graph 可以查看分支情况
  • 如果你已经 add 了这次修改, 文件变成了 “可提交状态” (staged), 我们可以在 diff 中添加参数 --cached 来查看修改
$ git log --cached
  • 还有种方法让我们可以查看 add 过 (staged) 和 没 add (unstaged) 的修改
$ git log --HEAD

3. 回到从前

reset回到add之前

有时我们添加 add 了修改, 但是又后悔, 并想补充一些内容再 add. 这时, 我们有一种方式可以回到 add 之前,即使用git reset file, 使文件file的状态有staged变成unstaged,变成未暂存状态

$ git reset file
修改已经commit的版本

使用git commit --amend命令可以实现在现有最新 commit 上再次提交改动的效果。
在本地提交改动后,我们再次修改代码,执行 git add 命令添加改动,如果执行 git commit -m 命令,默认会创建新的空 commit 信息,填写相应的修改说明,提交之后,会新增一个 commit 信息;而执行 git commit --amend 命令会弹出当前最新 commit 的信息,我们可以修改这个信息,也可以不修改,提交之后,用 git log 命令查看,会看到没有增加新的 commit,原先 commit 的 hash 值也没有变,这一次的修改是跟之前的修改一起提交的。

$ git commit --amend
$ git commit --amend --no-edit  # "--no-edit": 不编辑, 直接合并到上一个 commit
已经commit,还没push, 但是想撤销commit

首先简单介绍下HEAD, **HEAD是指当前的版本,**这个命令主要配合reset的–hard,–mixed和–solf三个参数对对本次的修改进行处理:

  • HEAD~1 指上一个版本,可以简写为HEAD~
  • HEAD~2 指回退两个版本

git reset的几种用法:

  • git reset --soft HEAD^:将最近一次提交节点的提交记录回退到暂存区,也就是保留git add的结果, 但是撤销的了git commit,工作区修改的代码保留
  • git reset --mixed HEAD^:将最近一次提交节点的提交记录回退到工作区,也就是同时撤销了git add和git commit, 但是保留的工作区修改的代码
  • git reset --hard HEAD^:将最近一次提交节点的提交记录全部清除, 撤销了git add 和 git commit, 工作区修改的代码没有保留。 这个用法一般在版本回退的时候使用, 其他时候要谨慎使用,因为工作区修改的代码都不见了

所以如果只需要撤销commit的话,可以使用git reset --soft HEAD^

版本回退

版本回退一般使用git reset --hard HEAD^命令或者git reset --hard commit-id
每个 commit 都有自己的 id 数字号, HEAD 是一个指针, 指引当前的状态是在哪个 commit. (可以使用git log查看commit id)

# 不管我们之前有没有做了一些 add 工作, 这一步让我们回到 上一次的 commit
# 方式1: "HEAD^"
$ git reset --hard HEAD^  
# 方式2: "commit id"
$ git reset --hard c6762a1

需要注意的是,当回退到了某个旧版本,想恢复到新版本,但找不到新版本的commit id时,可以使用git reflog来找到新版本的commit id(git reflog记录你的每一次命令)

4. 删除文件

在Git中,删除也是一个修改操作. 一般来讲, 在工作区中把没用的文件删了

$ rm test.txt

这个时候,Git知道你删除了文件,因此,工作区和版本库就不一致了,git status命令会立刻告诉你哪些文件被删除了:
现在你有两个选择,一是确实要从版本库中删除该文件,那就用命令git rm删掉,并且git commit

$ git rm test.txt
$ git commit -m "remove test.txt"

另一种情况是删错了,因为版本库里还有呢,所以可以很轻松地把误删的文件恢复到最新版本

$ git checkout -- test.txt

5. 推送至远程仓库

远程仓库,顾名思义是于我们本地仓库相对独立的另外一个仓库

  • git remte add 添加远程仓库
    例如
$ git remote add origin git@github.com:github-book/git-tutorial.git

按照上述命令, git会自动将git@github.com:github-book/git-tutorial.git远程仓库的名字设置为origin

  • git remote 查看远程仓库

也可以使用-v命令,显示对应的远程仓库员的地址

$ git remote -v
  • git remote show 查看某个远程仓库的详细信息
    比如要查看origin远程仓库,可以使用
$ git remote show origin
  • 远程仓库的删除和重命名
    使用git remote rename命令修改某个远程仓库在本地的简称,比如想把origin改成origin2,使用如下命令
$ git remote rename origin origin2

删除远程仓库, 运行git remote rm。 例如要删除名称为origin远程仓库

$ git remote rm origin
  • 推送至远程仓库

    • 推送至master分支
      如果想将当前分支下本地仓库中的内容推给远程仓库,需要用到git push命令。假定我们在master分支下进行操作
    $ git push -u origin master
    
     像这样执行git push命令,当前分支的内容就会被推送给远程仓库origin     的master分支,-u参数可以在推送的同时,**将origin仓库的master分支设置为本地仓库当前分支的upstream(上游)**, 添加了这个参数,将来可以运行git pull命令从远程仓库获取内容时,本地仓库的这个分支可以直接从origin的master分支获取内容,省去了另外添加参数的麻烦.
    
    • 推送至master以外的分支
      除了master分支外,远程仓库也可以创建其他分支.
      举个例子,我在本地仓库中创建feature-D分支,现在将它push给远程仓库并保持分支名不变
$ git checkout -b feature-D     本地创建feature-D分支
$ git push -u origin feature-D  push给远程仓库

6. 从远程仓库中获取

  • git clone获取远程仓库
$ git clone git@github.com:github-tutorial-book/git-tutorial.git

执行git clone命令后我们会默认处于master分支下,同时系统会自动将origin设置成该远程仓库的标识符。也就是说,当前本地仓库的master分支与Github端远程仓库(origin)的master分支内容完全相同

  • git pull获取最新的远程仓库分支
    git pull命令的作用是,取回远程主机某个分支的更新,再与本地的指定分支合并。它的完整格式稍稍有点复杂。
$ git pull <远程主机名> <远程分支名>:<本地分支名>

比如,取回origin主机的next分支,与本地的master分支合并,需要写成下面这样。

$ git pull origin next:master

如果远程分支是与当前分支合并,则冒号后面的部分可以省略。

$ git pull origin next

上面命令表示,取回origin/next分支,再与当前分支合并。实质上,这等同于先做git fetch,再做git merge。

$ git fetch origin
$ git merge origin/next

在某些场合,Git会自动在本地分支与远程分支之间,建立一种追踪关系(tracking)。比如,在git clone的时候,所有本地分支默认与远程主机的同名分支,建立追踪关系,也就是说,本地的master分支自动"追踪"origin/master分支

Git也允许手动建立追踪关系。

git branch --set-upstream master origin/next

上面命令指定master分支追踪origin/next分支。
如果当前分支与远程分支存在追踪关系,git pull就可以省略远程分支名。

$ git pull origin

上面命令表示,本地的当前分支自动与对应的origin主机"追踪分支"(remote-tracking branch)进行合并。
如果当前分支只有一个追踪分支,连远程主机名都可以省略。

$ git pull

上面命令表示,当前分支自动与唯一一个追踪分支进行合并。

  • git pull --rebase
    使用下面的关系区别这两个操作:
    git pull = git fetch + git merge
    git pull --rebase = git fetch + git rebase

  • git fetch
    一旦远程主机的版本库有了更新(Git术语叫做commit),需要将这些更新取回本地,这时就要用到git fetch命令。

$ git fetch <远程主机名>

比如,取回origin主机的master分支。

$ git fetch origin master

所取回的更新,在本地主机上要用"远程主机名/分支名"的形式读取。比如origin主机的master,就要用origin/master读取。
git branch命令的-r选项,可以用来查看远程分支,-a选项查看所有分支

$ git branch -r
origin/master

$ git branch -a
* master
  remotes/origin/master

上面命令表示,本地主机的当前分支是master,远程分支是origin/master。
可以使用git merge命令或者git rebase命令,在本地分支上合并远程分支

$ git merge origin/master
# 或者
$ git rebase origin/master

上面命令表示在当前分支上,合并origin/master。

  • git stash
    有时候会出现这样的情况,我们已经在本地的仓库中做了一些代码开发,但是现在另外一个人把他的代码推到了远程仓库,这个时候我们使用git pull进行合并的时候会有代码的冲突。
    可以使用git stash命令保存当前工作进度,会把暂存区和工作区的改动保存起来。执行完这个命令后,在运行git status命令,就会发现当前是一个干净的工作区,没有任何改动。使用git stash save 'message…'可以添加一些注释

    • git stash 会把暂存区和工作区的改动保存起来
    • git stash pop 恢复最新的进度到工作区。git默认会把工作区和暂存区的改动都恢复到工作区。
    • git stash pop stash_id@{1} 恢复指定的进度到工作区
    • git stash list 显示保存进度的列表。也就意味着,git stash命令可以多次执行。
    • git stash drop [stash_id] 删除一个存储的进度。如果不指定stash_id,则默认删除最新的存储进度。
    • git stash clear 删除所有存储的进度。

当本地工作区和暂存区的代码有冲突时,可以先用git stash保存当前工作进度,在使用git pull拉取远程代码,之后在用git stash pop恢复到工作区,没有冲突的部分会自动合并,对于有冲突的部分需要人工合并。合并完之后即可以使用git push将合并的代码推送至远程仓库.

<<< Updated upstream 和 === 之间的内容是pull下的内容
=== 和 >>> Staged changes 是本地修改的内容

7. git中的几个基本概念

HEAD: HEAD就是当前活跃分支的游标。形象的记忆就是:你现在在哪儿,HEAD就指向哪儿,所以Git才知道你在那儿!不过HEAD并非只能指向分支的最顶端(时间节点距今最近的那个),实际上它可以指向任何一个节点
origin: origin指向的就是你本地的代码库托管在Github上的版本

git remote -v
origin https://github.com/user/repository.git (fetch)
origin https://github.com/user/repository.git (push)

可以看的origin指向的位置是user的的远程代码库

master: git在第一次创建仓库时为其创建的默认分支的名称, 一般认为是主分支
origin/master: 标识远程跟踪分支, 远程存储库中主分支的本地副本
origin / HEAD: 表示远程上的默认分支

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值