@WillireamAngel
2018-05-13T02:35:00.000000Z
字数 8461
阅读 1838
Git
1.Linux:sudo apt-get install git
or sudo apt-get install git-core
all in "https://git-scm.com/download/linux"
2.Windows
Directly download and install later
To Configure the users and e-mail:
$ git config --global user.name "Your Name"
$ git config --global user.email "email@example.com"
$ mkdir learngit
$ cd learngit
$ pwd`
/f/计算机/Git/learngit
其中,mkdir
用于创建在当前目录创建文件夹,cd
用于进入文件夹,pwd
用于显示当前目录
2. 第二步,通过git init命令把这个目录变成Git可以管理的仓库:
$ git init
Initialized empty Git repository in F:/计算机/Git/learngit/.git/
git add files
添加文件到库
$ git add readme.txt
(2)git commit -m "description"
告诉git提交到git仓库
for example:
$ git commit -m "wrote a readme file"
[master (root-commit) 4ab957c] wrote a readme file
1 file changed, 2 insertions(+)
create mode 100644 readme.txt
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
no changes added to commit (use "git add" and/or "git commit -a")
2.查看difference:git diff files
(先查看difference后再add+commit提交)
3.cat file
列出相关文件具体内容。
2. 版本回退:
1.git log
查看版本信息历史记录(提交日志);
git log --pretty=oneline
2.版本回退:在Git中,HEAD表示当前版本,上一个版本就是HEAD^,上上一个版本就是HEAD^^,当然往上n个版本可写成HEAD~n。代码表示为git reset --hard HEAD~n
for example:
$ git reset --hard HEAD^
HEAD is now at 29f1ba8 wrote changed
3.回到原始版本或者某一特定版本:git reset --hard commit id
或者使用命令记录查找回退版本:git reflog
$ git reflog
f657feb HEAD@{0}: reset: moving to f657febccf33b8db38ddb3b75dbd3ecb86d0286d
29f1ba8 HEAD@{1}: reset: moving to HEAD^
f657feb HEAD@{2}: commit: append GPL
29f1ba8 HEAD@{3}: commit: wrote changed
3d8bff2 HEAD@{4}: commit: wrote a readme file v0.1
4ab957c HEAD@{5}: commit (initial): wrote a readme file
How to understand Stage:
1.The first step
2.The second step
4. 管理修改:git只接收add+commit的修改信息,add将修改放入暂存区,然后commit将暂存区文件保存。
5. 撤销修改:
命令git checkout -- readme.txt
意思是,把readme.txt文件在工作区的修改全部撤销,这里有两种情况:
1.一种是readme.txt自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;
2.一种是readme.txt已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。
即将此文件回到最近一次git commit或git add时的状态。
具体操作(已使用add):
1.cat file
$ cat readme.txt
Git is a distributed version control system.
Git is free software distributed under the GPL.
Git has a mutable index called stage.
Git tracks changes of files.
My stupid boss still prefers SVN.
2.git reset HEAD file
回退版本
$ git reset HEAD readme.txt
Unstaged changes after reset:
M readme.txt
3.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
no changes added to commit (use "git add" and/or "git commit -a")
4.git checkout -- readme.txt
5.git status
$ git status
On branch master
nothing to commit, working tree clean
6.cat file
$ cat readme.txt
Git is a distributed version control system.
Git is free software distributed under the GPL.
Git has a mutable index call=ed stage.
done
6. 删除文件
1.一般情况下,通常直接在文件管理器中把没用的文件删了,或者用rm命令删了。
2.两种现象:
一、确定要将该文件删除,使用git rm
命令,并且git coimmit
;
二、删错了,git checkout
将误删的文件恢复到最新版本。
3.你可以利用git恢复删除的文件上传到git库的最新的版本文件,但是要小心,你只能恢复文件到最新版本,你会丢失最近一次提交后你修改的内容。
$ ssh-keygen -t rsa -C "15521126382@qq.com"
正常的话,用户主目录里找到.ssh目录,里面有id_rsa和id_rsa.pub两个文件,这两个就是SSH Key的秘钥对,id_rsa是私钥,不能泄露出去,id_rsa.pub是公钥,可以放心地告诉任何人。
2.Add SSH key:
2. 添加远程库:
1.在GitHub中create new repository
2.本地库链接库:git remote add origin git@server-name:path/repo-name.git
$ git remote add origin git@github.com:WillireamAngel/learngit.git
3.本地库推到远程库上:
$ git push -u origin master
Counting objects: 23, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (16/16), done.
Writing objects: 100% (23/23), 1.80 KiB | 0 bytes/s, done.
Total 23 (delta 6), reused 0 (delta 0)
remote: Resolving deltas: 100% (6/6), done.
To github.com:WillireamAngel/learngit.git
* [new branch] master -> master
Branch master set up to track remote branch master from origin.
远程库推送,利用git push
命令,实际上是把当前分支master
推送到远程。
第一次推送master
分支时,加上了-u
参数,Git不但会把本地的master
分支内容推送的远程新的master
分支,还会把本地的master
分支和远程的master
分支关联起来,在以后的推送或者拉取时就可以简化命令。
4.把本地master
分支全部推到Github
$ git push origin master
Everything up-to-date
git clone git@github.com:servername/repositoryname.git
$ git clone git@github.com:WillireamAngel/gitskills.git
Cloning into 'gitskills'...
remote: Counting objects: 3, done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
Receiving objects: 100% (3/3), done.
git branch 分支名
git checkout 分支名
git branch
git checkout -b 分支名
$ git checkout -b dev
Switched to a new branch 'dev'
M readme.txt
$ git branch
* dev
master
4.对现有的readme.txt文件进行修改,例如添加Creating a new branch is quick.
5.提交相关分支修改
$ git add readme.txt
$ git commit -m "branch test"
[dev cfc17c4] branch test
1 file changed, 3 insertions(+), 1 deletion(-)
6.切换分支git checkout 分支名
$ git checkout master
Switched to branch 'master'
Your branch is up-to-date with 'origin/master'.
7.检查相关文件提交内容,发现并未修改
$ cat readme.txt
Git is a distributed version control system.
Git is free software distributed under the GPL.
Git has a mutable index called stage.
8.合并制定 分支到当前分支git merge 分支名
$ git merge dev
Updating f213a5c..cfc17c4
Fast-forward
readme.txt | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
其中Fast-forward
是快进模式,但并非每个合并都是快进模式
9.删除分支git branch -d 分支名
$ git branch -d dev
Deleted branch dev (was cfc17c4).
10.检查相关分支及相关文件内容
$ git branch
* master
$ cat readme.txt
Git is a distributed version control system.
Git is free software distributed under the GPL.
Git has a mutable index called stage.
Creating a new branch is quick.
Fast forward
模式会丢掉删除的分支信息,采用--no-ff
方式强制禁用Fast forward
,同时生成一个commit
,并利用- m
书写相关描述。
$ git checkout -b dev
Switched to a new branch 'dev'
2.修改readme.txt文件,并提交一个新的commit:
$ git add readme.txt
$ git commit -m "add merge"
[dev 6224937] add merge
1 file changed, 1 insertion(+)
3.现在,我们切换回master:
$ git checkout master
Switched to branch 'master'
4.准备合并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(+)
5.因为本次合并要创建一个新的commit,所以加上-m参数,把commit描述写进去。
在实际开发中,我们应该按照几个基本原则进行分支管理:
master分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活,干活都在dev分支上,也就是说,dev分支是不稳定的,到某个时候,比如1.0版本发布时,再把dev分支合并到master上,在master分支发布1.0版本。
4. Bug分支:
修复bug时,我们会通过创建新的bug分支进行修复,然后合并,最后删除;
当手头工作没有完成时,先把工作现场git stash
一下,然后去修复bug,修复后,再git stash pop
,回到工作现场。
$ git stash
Saved working directory and index state WIP on naive: fa8a0a3 conflict fixed
HEAD is now at fa8a0a3 conflict fixed
git stash pop
=git stash apply
(恢复内容)+git stash drop
(删除相关stash文件)
利用git stash list
可以查看相关stash
内容
5. Feature分支
开发一个新feature,最好新建一个分支;
如果要丢弃一个没有被合并过的分支,可以通过git branch -D <name>
强行删除。
$ git branch -d future
error: The branch 'future' is not fully merged.
If you are sure you want to delete it, run 'git branch -D future'.
git push 仓库名 分支名
$ git push origin master
Counting objects: 12, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (12/12), done.
Writing objects: 100% (12/12), 1.18 KiB | 0 bytes/s, done.
Total 12 (delta 5), reused 0 (delta 0)
remote: Resolving deltas: 100% (5/5), completed with 1 local object.
To github.com:WillireamAngel/learngit.git
f213a5c..fa8a0a3 master -> master
2.常用分支推送需要:
- master
分支是主分支,因此要时刻与远程同步;
- dev
分支是开发分支,团队所有成员都需要在上面工作,所以也需要与远程同步;
- bug
分支只用于在本地修复bug,就没必要推到远程了,除非老板要看看你每周到底修复了几个bug;
- feature
分支是否推到远程,取决于你是否和你的小伙伴合作在上面开发。
3.抓取分支
从本地推送分支,使用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 push origin branch-name
推送就能成功.
git tag <name>
用于新建一个标签,默认为HEAD(当前分支),也可以指定一个commit id:git tag <name> commit id
;
$ git branch
* master
naive
$ git tag v1.0
$ git tag v0.9 b605eb9
$ git tag -a v0.1 -m "version 0.1 released" 0801a49
$ git tag -s v0.2 -m "signed version 0.1 released" fa8a0a3
$ git show v0.1
......
$ git tag
v0.9
v1.0
......
git push origin <tagname>
可以推送一个本地标签; git push origin --tags
可以推送全部未推送过的本地标签; git tag -d <tagname>
可以删除一个本地标签; git push origin :refs/tags/<tagname>
可以删除一个远程标签。在GitHub上,可以任意Fork开源仓库;自己拥有Fork后的仓库的读写权限;
可以推送pull request给官方仓库来贡献代码。
.gitignore
; .gitignore
文件本身要放到版本库里,并且可以对.gitignore做版本管理! git config --global alias.别名 原命令
--global
是针对当前用户起作用的,如果不加,那只针对当前的仓库起作用; git/config/alias
; .gitconfig
中。