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仓库,分两步:
-
git add
,可反复多次使用添加多个文件,也可以把不通的file用空格隔开; -
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
删除一个文件。如果一个文件已经被提交到版本库,那么你永远不用担心误删。但是一定要注意,这种情况下,你只能恢复文件到最新版本,你会丢失最近一次提交后你修改的内容。
撤销修改的三种情况:
只是做了修改,没有之行git命令操作文件:
当你修改了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout -- file
。只执行了git add:
不但修改了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD file
,就回到了1(只执行了git add),第二步按1操作。不但执行了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
-
git pull
首先更新到最新版本。 - 如果合并有冲突,则解决冲突,并在本地提交。
-
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 |
关联一个远程库 |