git

---恢复内容开始---

1、安装 

https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/00137396287703354d8c6c01c904c7d9ff056ae23da865a000 

2、修改设置仓库用户及邮箱

新增 : 

$ git config --global user.name "Your Name"
$ git config --global user.email "email@example.com"
 查看:
$ git config user.name
$ git config user.email
修改:
$ git config --global user.name "username"  
$ git config --global user.email "email"
3、创建、查看目录
$ mkdir learngit 
$ cd learngit 
$ pwd /Users/michael/learngit
4、把这个目录变成Git可以管理的仓库,也不一定必须在空目录下创建Git仓库,选择一个已经有东西的目录也是可以的
$ git init
ls -ah  (查看隐藏的.git 目录,判断是否是git 仓库)
5、把文件添加到仓库
$ git add readme.txt
6、用命令git commit告诉Git,把文件提交到仓库
$ git commit -m "wrote a readme file"
commit可以一次提交很多文件,所以你可以多次add不同的文件
7、查看git 状态  git status
$ git status 
# On branch master 
# Changes not staged for commit: (未add)
#   (use "git add <file>..." to update what will be committed) 
#   (use "git checkout -- <file>..." to discard changes in working directory) 
# #    modified:   readme.txt 
# no changes added to commit (use "git add" and/or "git commit -a")
8、查看修改部分 
$ git diff readme.txt
diff --git a/readme.txt b/readme.txt index 46d49bf..9247db6 100644 
--- a/readme.txt 
+++ b/readme.txt 
@@ -1,2 +1,2 @@ 
-Git is a version control system.   (修改前)
+Git is a distributed version control system.  (修改后)
Git is free software  (没有做任何修改)
$ git status 
# On branch master 
# Changes to be committed: (add 之后的准备提交)
#   (use "git reset HEAD <file>..." to unstage) 
# #       modified:   readme.txt # 
8、git log (--pretty=oneline 简短版
9、版本回退   使用 git reset 命令
$ git reset --hard HEAD^ 
HEAD is now at ea34578 add distributed

HEAD表示当前版本
上一个版本就是HEAD^
上上一个版本就是HEAD^^
往上100个版本写100个^比较容易数不过来,所以写成HEAD~100

往下:

办法其实还是有的,只要上面的命令行窗口还没有被关掉,你就可以顺着往上找啊找啊,找到那个append GPLcommit id3628164...,于是就可以指定回到未来的某个版本:

$ git reset --hard 3628164
HEAD is now at 3628164 append GPL

版本号没必要写全,前几位就可以了,Git会自动去找。

 

Git提供了一个命令git reflog用来记录你的每一次命令:

$ git reflog 
ea34578 HEAD@{0}: reset: moving to HEAD^ 
3628164 HEAD@{1}: commit: append GPL 
ea34578 HEAD@{2}: commit: add distributed 
cb926e7 HEAD@{3}: commit (initial): wrote a readme file 
10、暂存区的概念

先对readme.txt做个修改,比如加上一行内容:


Git is a distributed version control system. 
Git is free software distributed under the GPL. 
Git has a mutable index called stage. 

然后,在工作区新增一个LICENSE文本文件(内容随便写)。

先用git status查看一下状态:

$ git status 
# On branch master 
# Changes not staged for commit: 
#   (use "git add <file>..." to update what will be committed) 
#   (use "git checkout -- <file>..." to discard changes in working directory) 
# #       modified:   readme.txt 
# # Untracked files: 
#   (use "git add <file>..." to include in what will be committed) # 
#       LICENSE no changes added to commit (use "git add" and/or "git commit -a") 

Git非常清楚地告诉我们,readme.txt被修改了,而LICENSE还从来没有被添加过,所以它的状态是Untracked

现在,使用两次命令git add,把readme.txtLICENSE都添加后,用git status再查看一下:

$ git status 
# On branch master 
# Changes to be committed: 
#   (use "git reset HEAD <file>..." to unstage) 
# #       new file:   LICENSE 
#       modified:   readme.txt # 

 11、git 特点 

Git跟踪并管理的是修改,而非文件。 

 Git管理的是修改,当你用git add命令后,在工作区的第一次修改被放入暂存区,准备提交,但是,在工作区的第二次修改并没有放入暂存区,所以,git commit只负责把暂存区的修改提交了,也就是第一次的修改被提交了,第二次的修改不会被提交。

 git diff HEAD -- readme.txt   命令可以查看工作区和版本库里面最新版本的区别

 12、git checkout -- file可以丢弃工作区的修改

命令git checkout -- readme.txt意思就是,把readme.txt文件在工作区的修改全部撤销,这里有两种情况:

一种是readme.txt自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;

一种是readme.txt已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。

总之,就是让这个文件回到最近一次git commitgit add时的状态。

 13、用命令git reset HEAD file可以把暂存区的修改撤销掉(unstage),重新放回工作区:

$ git reset HEAD readme.txt

 14、删除文件

在Git中,删除也是一个修改操作,我们实战一下,先添加一个新文件test.txt到Git并且提交:

$ git add test.txt
$ git commit -m "add test.txt"
[master 94cdc44] add test.txt
 1 file changed, 1 insertion(+)
 create mode 100644 test.txt

一般情况下,你通常直接在文件管理器中把没用的文件删了,或者用rm命令删了:

$ rm test.txt

这个时候,Git知道你删除了文件,因此,工作区和版本库就不一致了,git status命令会立刻告诉你哪些文件被删除了:

$ git status
# On branch master
# Changes not staged for commit:
#   (use "git add/rm <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#       deleted:    test.txt
#
no changes added to commit (use "git add" and/or "git commit -a")

现在你有两个选择,一是确实要从版本库中删除该文件,那就用命令git rm删掉,并且git commit

$ git rm test.txt
rm 'test.txt'
$ git commit -m "remove test.txt"
[master d17efd8] remove test.txt
 1 file changed, 1 deletion(-)
 delete mode 100644 test.txt

现在,文件就从版本库中被删除了。

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

$ git checkout -- test.txt

git checkout其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。

小结

命令git rm用于删除一个文件。如果一个文件已经被提交到版本库,那么你永远不用担心误删,但是要小心,你只能恢复文件到最新版本,你会丢失最近一次提交后你修改的内容

第1步:创建SSH Key。在用户主目录下,看看有没有.ssh目录,如果有,再看看这个目录下有没有id_rsaid_rsa.pub这两个文件,如果已经有了,可直接跳到下一步。如果没有,打开Shell(Windows下打开Git Bash),创建SSH Key:

$ ssh-keygen -t rsa -C "youremail@example.com" 

你需要把邮件地址换成你自己的邮件地址,然后一路回车,使用默认值即可,由于这个Key也不是用于军事目的,所以也无需设置密码。

如果一切顺利的话,可以在用户主目录(window 在用户/yulb下,linux 在~/ssh 下 ls -a 查看所有 包含隐藏文件)里找到.ssh目录,里面有id_rsaid_rsa.pub两个文件,这两个就是SSH Key的秘钥对,id_rsa是私钥,不能泄露出去,id_rsa.pub是公钥,可以放心地告诉任何人。

 15、本地添加 .ssh id_rsaid_rsa.pub

  id_rsa是私钥,不能泄露出去,id_rsa.pub是公钥,可以放心地告诉任何人

 16、远程github 

登陆GitHub,打开“Account settings”,“SSH Keys”页面:

然后,点“Add SSH Key”,填上任意Title,在Key文本框里粘贴id_rsa.pub文件的内容:

17、创建一个新仓库

在右上角找到“Create a new repo”按钮,创建一个新的仓库: 

 18、本地和远程仓库关联

我们根据GitHub的提示,在本地的learngit仓库下运行命令:

$ git remote add origin git@github.com:username/learngit.git
要关联一个远程库,使用命令git remote add origin git@server-name:path/repo-name.git

 远程库的名字就是origin,这是Git默认的叫法,也可以改成别的,但是origin这个名字一看就知道是远程库。

从现在起,只要本地作了提交,就可以通过命令:

$ git push origin master 

把本地master分支的最新修改推送至GitHub,现在,你就拥有了真正的分布式版本库!

 19、从远程仓库克隆到本地

现在,远程库已经准备好了,下一步是用命令git clone克隆一个本地库:

$ git clone git@github.com:michaelliao/gitskills.git

 使用https除了速度慢以外,还有个最大的麻烦是每次推送都必须输入口令,但是在某些只开放http端口的公司内部就无法使用ssh协议而只能用https

 20、创建分支

Git鼓励大量使用分支:

查看分支:git branch

创建分支:git branch <name>

切换分支:git checkout <name>

创建+切换分支:git checkout -b <name>

合并某分支到当前分支:git merge <name>

删除分支:git branch -d <name>

下面开始实战。

首先,我们创建dev分支,然后切换到dev分支:

$ git checkout -b dev Switched to a new branch 'dev' 

git checkout命令加上-b参数表示创建并切换,相当于以下两条命令:

$ git branch dev $ git checkout dev Switched to branch 'dev' 

然后,用git branch命令查看当前分支:

$ git branch * dev   master 

git branch命令会列出所有分支,当前分支前面会标一个*号。

然后,我们就可以在dev分支上正常提交,比如对readme.txt做个修改,加上一行:

Creating a new branch is quick. 

然后提交:

$ git add readme.txt  $ git commit -m "branch test" [dev fec145a] branch test  1 file changed, 1 insertion(+) 

现在,dev分支的工作完成,我们就可以切换回master分支:

$ git checkout master Switched to branch 'master' 

切换回master分支后,再查看一个readme.txt文件,刚才添加的内容不见了!因为那个提交是在dev分支上,而master分支此刻的提交点并没有变:

git-br-on-master

现在,我们把dev分支的工作成果合并到master分支上:

$ git merge dev Updating d17efd8..fec145a Fast-forward  readme.txt |    1 +  1 file changed, 1 insertion(+) 

git merge命令用于合并指定分支到当前分支。合并后,再查看readme.txt的内容,就可以看到,和dev分支的最新提交是完全一样的。

注意到上面的Fast-forward信息,Git告诉我们,这次合并是“快进模式”,也就是直接把master指向dev的当前提交,所以合并速度非常快。

当然,也不是每次合并都能Fast-forward,我们后面会讲其他方式的合并。

合并完成后,就可以放心地删除dev分支了:

$ git branch -d dev Deleted branch dev (was fec145a). 

删除后,查看branch,就只剩下master分支了:

$ git branch * master 

因为创建、合并和删除分支非常快,所以Git鼓励你使用分支完成某个任务,合并后再删掉分支,这和直接在master分支上工作效果是一样的,但过程更安全。

 21、解决分支

merge失败,有conflicts没解决,可以:

1、解决conflicts后再次执行merge;

2、回退到merge前

 git reset --merge

 git log --graph命令可以看到分支合并图。

 22、取消快速 模式

准备合并dev分支,请注意--no-ff参数,表示禁用Fast forward

$ git merge --no-ff -m "merge with no-ff" dev 
Merge made by the 'recursive' strategy.  
readme.txt |    1 +  
1 file changed, 1 insertion(+) 

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

 23、bug 分支

Git还提供了一个stash功能,可以把当前工作现场“储藏”起来,等以后恢复现场后继续工作:

$ git stash 
Saved working directory and index state WIP on dev: 6224937 add merge HEAD is now at 6224937 add merge 

现在,用git status查看工作区,就是干净的(除非有没有被Git管理的文件),因此可以放心地创建分支来修复bug。

git stash list命令看看:

$ git stash list 
stash@{0}: WIP on dev: 6224937 add merge 

但是需要恢复一下,有两个办法:

一是用git stash apply恢复,但是恢复后,stash内容并不删除,你需要用git stash drop来删除;

另一种方式是用git stash pop,恢复的同时把stash内容也删了:

你可以多次stash,恢复的时候,先用git stash list查看,然后恢复指定的stash,用命令:

$ git stash apply stash@{0} 

 Git友情提醒,feature-vulcan分支还没有被合并,如果删除,将丢失掉修改,如果要强行删除,需要使用命令git branch -D feature-vulcan

 24、多人写作

git remote -v显示更详细的信息 
$ git remote -v
origin  git@github.com:michaelliao/learngit.git (fetch)
origin  git@github.com:michaelliao/learngit.git (push)

 推送分支

$ git push origin master
  • 查看远程库信息,使用git remote -v

  • 本地新建的分支如果不推送到远程,对其他人就是不可见的;

  • 从本地推送分支,使用git push origin branch-name,如果推送失败,先用git pull抓取远程的新提交;

  • 在本地创建和远程分支对应的分支,使用git checkout -b branch-name origin/branch-name,本地和远程分支的名称最好一致;

  • 建立本地分支和远程分支的关联,使用git branch --set-upstream branch-name origin/branch-name

  • 从远程抓取分支,使用git pull,如果有冲突,要先处理冲突。

25 、标签管理

 tag就是一个让人容易记住的有意义的名字 如 版本号是v1.2

 敲命令git tag <name>就可以打一个新标签

 可以用命令git tag查看所有标签

 忘了打标签,怎么办?

$ git log --pretty=oneline --abbrev-commit
6a5819e merged bug fix 101
cc17032 fix bug 101
7825a50 merge with no-ff
6224937 add merge
59bc1cb conflict fixed
400b400 & simple
75a857c AND simple
fec145a branch test
d17efd8 remove test.txt
... 

比方说要对add merge这次提交打标签,它对应的commit id是6224937,敲入命令:

$ git tag v0.9 6224937

 git show <tagname>查看标签信息

还可以创建带有说明的标签,用-a指定标签名,-m指定说明文字:

$ git tag -a v0.1 -m "version 0.1 released" 3628164 

用命令git show <tagname>可以看到说明文字:

还可以创建带有说明的标签,用-a指定标签名,-m指定说明文字:

$ git tag -a v0.1 -m "version 0.1 released" 3628164 

用命令git show <tagname>可以看到说明文字:

$ git show v0.1 
tag v0.1 Tagger: Michael Liao <askxuefeng@gmail.com> Date:   Mon Aug 26 07:28:11 2013 +0800  version 0.1 released  commit 3628164fb26d48395383f8f31179f24e0882e1e0 Author: Michael Liao <askxuefeng@gmail.com> Date:   Tue Aug 20 15:11:49 2013 +0800      append GPL

 26、操作标签

 删除标签

$ git tag -d v0.1
Deleted tag 'v0.1' (was e078af9)

如果要推送某个标签到远程,使用命令git push origin <tagname>

$ git push origin v1.0 
Total 0 (delta 0), reused 0 (delta 0) To git@github.com:michaelliao/learngit.git  * [new tag]         
v1.0 -> v1.0

或者,一次性推送全部尚未推送到远程的本地标签:

$ git push origin --tags

如果标签已经推送到远程,要删除远程标签就麻烦一点,先从本地删除:

$ git tag -d v0.9 Deleted tag 'v0.9' (was 6224937)

然后,从远程删除。删除命令也是push,但是格式如下:

$ git push origin :refs/tags/v0.9
原文地址:https://www.cnblogs.com/tank-/p/8352619.html