git速查笔记

git使用

本篇只是对git的常用命令做一个简单的总结,关于git更详细的介绍,请参考https://git-scm.com/doc

生成SSH Public Key

首先我们来到./ssh下:

$ cd ~/.ssh
$ ls
copy           github_rsa     github_rsa.pub key_backup     known_hosts

如果没有id_rsa.pub和id_rsa就需要我们来手动生成:

$ ssh-keygen -t rss -C “your_email"
Generating public/private rsa key pair.
Enter file in which to save the key(/Users/your_user_directory/.ssh/id_rsa):
...

提示输入密码的地方(Enter passphrase)直接回车就好。

成功后会提示:

Your identification has been saved in /Users/your_user_directory/.ssh/id_rsa.
Your public key has been saved in /Users/your_user_directory/.ssh/id_rsa.pub.
The key fingerprint is:
...

接着把id_rsa.pub里面的内容发给服务端配置:

$ cat id_rsa.pub
...

接着完成git的安装与配置,这里不再赘述。

git常用命令

一、初始化(init)


使用git init命令初始化Git。

添加文件到Git仓库,分两步:

  1. git add ,可反复多次使用添加多个文件,也可以把不通的file用空格隔开;
  2. git commit -m 'descreption',-m后面要对本次提交内容做相应的描述,以便以后查看。

尝试一下:

首先新建一个目录来初始化git,我在桌面上创建一个talkToGit的文件夹:

$ ~ cd Desktop 
Desktop $ mkdir talkToGit
Desktop $ cd talkToGit 

初始化一个Git仓库:

talkToGit $ git init
Initialized empty Git repository in /Users/your_user_directory/Desktop/talkToGit/.git/

新建一个文件并且输入"yourname:hello petty girl.":

talkToGit git:(master) $ vi gitLady.txt

查看一下输入的内容,比如我叫azrael,输出的内容如下:

talkToGit git:(master) $ cat gitLady.txt 
azrael:hello petty girl.

查看一下当前的状态(git status):

talkToGit git:(master) $ git status
On branch master
Initial commit
Untracked files:
  (use "git add ..." to include in what will be committed)
    gitLady.txt
nothing added to commit but untracked files present (use "git add" to track)

好了现在我们把新添加的文件添加到暂存区(git add):

talkToGit git:(master) $ git add gitLady.txt 
talkToGit git:(master) $ git status
On branch master
Initial commit
Changes to be committed:
  (use "git rm --cached ..." to unstage)
    new file:   gitLady.txt

最后把文件上传(git commit):

talkToGit git:(master) $ git commit -m '将gitLady第一次提交本地'
[master (root-commit) e4b0f0d] 将gitLady第一次提交本地
 1 file changed, 1 insertion(+)
 create mode 100644 gitLady.txt

xcode中有一些文件我们想在每次提交git的时候都忽略掉要怎么做呢?很简单,在工作目录(跟.git同级目录)创建.gitignore文件。在这个文件中填写好需要忽略的文件。文件内容这里已经为大家写好,可以自行选择需要的.gitignore文件使用。

二、本地修改(reset&checkout&rm)


  • git log
    查看提交历史,以便确定要回退到哪个版本。

  • git reflog
    查看命令历史,得到commit_id、以便确定要回到未来的指定版本。

  • git reset --hard commit_id
    HEAD指向的版本就是当前版本,因此,Git允许我们在版本的历史之间穿梭,使用命令。

  • git rm
    删除一个文件。如果一个文件已经被提交到版本库,那么你永远不用担心误删。但是一定要注意,这种情况下,你只能恢复文件到最新版本,你会丢失最近一次提交后你修改的内容。


撤销修改的三种情况:

  1. 只是做了修改,没有之行git命令操作文件:
    当你修改了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout -- file

  2. 只执行了git add:
    不但修改了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD file,就回到了1(只执行了git add),第二步按1操作。

  3. 不但执行了git add而且已经git commit过了:
    已经提交了不合适的修改到版本库时,想要撤销本次提交,参考版本回退(git reset --hard commit_id),不过前提是没有推送到远程库。


首先我们做一些准备工作,先修改一下gitLady.txt文件,添加一句回答:

azrael:hello petty girl.
git:Hi,fresh.

重新上传一次gitLady.txt文件:

talkToGit git:(master) $ git add gitLady.txt 
talkToGit git:(master) $ git commit -m 'git first talk'
[master 7fc99d8] git first talk
 1 file changed, 3 insertions(+), 1 deletion(-)
talkToGit git:(master) $  git status
On branch master
nothing to commit, working directory clean

接着我们继续修改gitLady.txt,问一问git是否认识svn:

azrael:hello petty girl.
git:Hi,fresh.
azrael:Do you know svn?

再次上传gitLady.txt文件:

talkToGit git:(master) $ git add gitLady.txt 
talkToGit git:(master) $ git commit -m '与git的第二次对话'
[master c98fe59] 与git的第二次对话
 1 file changed, 1 insertion(+), 1 deletion(-)

准备工作完成,先看看我们的提交历史:

talkToGit git:(master) $ git log

输入内容如下:

commit c98fe592f7b4a825b1fb19f151b6aaf2e2497b50
Author: your_name 
Date:   Wed Aug 17 22:48:52 2016 +0800

    与git的第二次对话

commit 7fc99d845d61d35fd40f4bffc93603988941fa6e
Author: your_name 
Date:   Wed Aug 17 19:26:09 2016 +0800

    git first talk

commit e4b0f0d7d044847b49f995e38c3768a3cb0d120f
Author: your_name 
Date:   Wed Aug 17 19:07:39 2016 +0800

    将gitLady第一次提交本地

还可以查看命令历史:

talkToGit git:(master) $ git reflog

c98fe59 HEAD@{0}: commit: 与git的第二次对话
7fc99d8 HEAD@{1}: commit: git first talk
e4b0f0d HEAD@{2}: commit (initial): 将gitLady第一次提交本地

接下来只要我们知道commit_id就可以任意的在历史版本里穿梭:

talkToGit git:(master) $ git reset --hard e4b0f0d7d044847b49f995e38c3768a3cb0d120f
HEAD is now at e4b0f0d 将gitLady第一次提交本地
talkToGit git:(master) $ cat gitLady.txt 
azrael say:hello petty girl.
talkToGit git:(master) $ git log
talkToGit git:(master) $ git reflog
talkToGit git:(master) $ git reset --hard c98fe59
HEAD is now at c98fe59 与git的第二次对话
talkToGit git:(master) cat gitLady.txt 
azrael:hello petty girl.
git:Hi,fresh.
azrael:Do you know svn?
三、远程交流(remote&clone&push)
A、从远程库克隆

要克隆一个仓库,首先必须知道仓库的地址,然后使用git clone命令克隆。
Git支持多种协议,包括https,但通过ssh支持的原生git协议速度最快。

创建与合并分支

查看分支:git branch
创建分支:git branch
切换分支:git checkout
创建+切换分支:git checkout -b
合并某分支到当前分支:git merge
删除分支:git branch -d

B、关联远程库(暂时不需要跳过)

要关联一个远程库,使用命令git remote add origin git@server-name:path/repo-name.git
关联后,使用命令git push -u origin master第一次推送master分支的所有内容;
此后,每次本地提交后,只要有必要,就可以使用命令git push origin master推送最新修改;

这里先使用github作为远程库测试:[email protected]:AzraelWang/gitTest.
关联前先确保我已经添加了你的SSH Key。

关联远程库:

talkToGit git:(master) $ git remote add origin [email protected]:AzraelWang/gitTest
talkToGit git:(master) $ git pull [email protected]:AzraelWang/gitTest         
From github.com:AzraelWang/gitTest
 * branch            HEAD       -> FETCH_HEAD
Merge made by the 'recursive' strategy.
 README.md | 1 +
 1 file changed, 1 insertion(+)
 create mode 100644 README.md
talkToGit git:(master) $ git push -u origin master
Counting objects: 11, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (6/6), done.
Writing objects: 100% (11/11), 1.09 KiB | 0 bytes/s, done.
Total 11 (delta 0), reused 0 (delta 0)
To [email protected]:AzraelWang/gitTest
   bdadb7b..8d27f86  master -> master
Branch master set up to track remote branch master from origin.

**一些问题: **

1:使用github可能会遇到:

$ git remote add origin [email protected]:XXX/XXX.git
fatal: remote origin already exists.

$ git push -u origin master
remote: Repository not found.

fatal: repository 'https:...' not found

解决方法:

$ git remote remove origin

2:没有先pull下来远程库(一定要记住git命令的基本执行顺序:本地commit-远程pull-push):

$ git push origin master To [email protected]:XXX/XXX.git
! [rejected] master -> master (non-fast-forward)
error: failed to push some refs to '[email protected]:XXX/XXX.git' hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g. hint: 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

解决方法:

hint: 'git pull ...') before pushing again.
四、分支

合并分支时,加上--no-ff参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而fast forward合并就看不出来曾经做过合并。

$ git merge --no-ff -m "merge with no-ff" dev

如果要丢弃一个没有被合并过的分支,可以通过git branch -D 强行删除。

四、冲突

当Git无法自动合并分支时,就必须首先解决冲突。解决冲突后,再提交,合并完成。
git log --graph命令可以看到分支合并图。

git log --graph --pretty=oneline --abbrev-commit
五、bug修复(git stash

创建bug分支-修复bug-合并-删除。

git stash
有些时候我们手头的工作还没有完成,这个时候有个紧急的bug需要修复。这个时候可以用到这个命令。

当手头工作没有完成时,先把工作现场git stash一下,然后去修复bug,修复后,再git stash pop,回到工作现场。

git stash list 查看收藏列表
git stash apply 恢复到收藏版本,但是恢复后,stash内容并不删除。
git stash drop 删除收藏版本。
git stash pop 恢复的同时把stash内容也删了:

六、多人协作

commit-pull-解决冲突-push

  1. git pull首先更新到最新版本。
  2. 如果合并有冲突,则解决冲突,并在本地提交。
  3. git push origin branch-name推送本地修改。

如果git pull提示“no tracking information”,说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream branch-name origin/branch-name
git remote -v查看远程版本信息。

七、标签-项目版本纪录(git tag)
  • git tag 用于新建一个标签,默认为HEAD,也可以指定一个commit id;

  • git tag -a -m "xxx"可以指定标签信息;

  • git tag可以查看所有标签。

  • git push origin 可以推送一个本地标签;

  • git push origin --tags可以推送全部未推送过的本地标签;

  • git tag -d 可以删除一个本地标签;

  • git push origin :refs/tags/可以删除一个远程标签


常用命令表:

命令 说明
git init 初始化一个Git仓库
git add 添加文件
git commit 提交到暂存区域
git reset --hard commit_id 回退到指定版本
git log 查看提交历史
git reflog 用查看命令历史(查看每次执行的命令)
git checkout -- file 丢弃工作区的修改
git reset HEAD file 撤回上一次的提交
git rm 删除文件
git remote add origin git@server-name:path/repo-name.git 关联一个远程库

你可能感兴趣的:(git速查笔记)