Git学习笔记
git下载
创建版本库
创建一个空白文件夹,并进入文件夹,或在文件夹位置打开git-bash
初始化文件夹,使文件夹可以被git管理
$git init
注意事项:
- 只能跟踪文本文件的改动,比如TXT文件,网页,所有的程序代码,例如word是二进制编码,无法记录更改,图片只能确定改动的大小。
- 注意编码格式,各种文本编码格式最好统一使用UTF-8。
- windows下最好不要使用默认记事本打开文本文档(默认在文件开头加了一个十六进制字符,导致一些问题,例如网页第一行可能会出现一个"?",文本文档可能显示不全等),最好下载一个Notepad++代替记事本。
把文本添加到版本库
$ git add readme.txt //向暂存区添加文件
$ git commit -m "wrote a readme file(大于10个字符)" //提交文件并添加注释
撤销更改
$ git checkout -- readme.txt
// 如果本地分支有了修改,但想丢弃修改。(文件内容的修改)
注意:从来没有被添加到版本库就被删除的文件,是无法恢复的!
版本回退
$ git log //查看历史操作信息
commit 1094adb7b9b3807259d8cb349e7df1d4d6477073 (HEAD -> master)
Author: *** *** <***@gmail.com>
Date: Fri May 18 21:06:15 2018 +0800
append GPL
commit e475afc93c209a690c39c13a46716e8fa000c366
Author: *** *** <***@gmail.com>
Date: Fri May 18 21:03:36 2018 +0800
add distributed
commit eaadf4e385e865d25c48e7ca9c8395c3f7dfaef0
Author: *** *** <***@gmail.com>
Date: Fri May 18 20:59:18 2018 +0800
wrote a readme file
commit 1094adb7b9b3807259d8cb349e7df1d4d6477073 :commi id 由SHA1计算出来的版本号(确保多人协作同一文件时,版本id不会冲突)
$ git reset --hard HEAD^ //回退到上一个版本
$ git reset --hard 1094a //回退到指定版本(只需输入commi id中前几位,git会自己去找)
$ git commit -m "wrote a readme file(大于10个字符)" //提交文件及注释
穿梭前,用git log可以查看提交历史,以便确定要回退到哪个版本。
要重返未来,用git reflog查看命令历史,以便确定要回到未来的哪个版本。
分支管理
每次提交,Git都把它们串成一条时间线,这条时间线就是一个分支。
当我们创建新的分支,例如dev时,Git新建了一个指针叫dev,指向master相同的提交,再把HEAD指向dev,就表示当前分支在dev上:
$ git checkout -b dev
Switched to a new branch 'dev'
$ git branch dev
$ git checkout dev
Switched to branch 'dev'
$ git checkout dev
Switched to branch 'dev'
用git branch命令查看当前分支:
$ git branch
* dev
master
新提交一次后,dev指针往前移动一步,而master指针不变:
$ git add readme.txt
$ git commit -m "branch test"
[dev b17d20e] branch test
1 file changed, 1 insertion(+)
切换回master分支后,再查看一个readme.txt文件,刚才添加的内容不见了!因为那个提交是在dev分支上,而master分支此刻的提交点并没有变:
$ git checkout master
Switched to branch 'master'
git merge命令用于合并指定分支到当前分支。
$ git merge dev
Updating d46f35e..b17d20e
Fast-forward
readme.txt | 1 +
1 file changed, 1 insertion(+)
删除dev分支就是把dev指针给删掉,删掉后,我们就剩下了一条master分支:
$ git branch -d dev
Deleted branch dev (was b17d20e).
解决冲突
合并分支可能会出现冲突。必须手动解决冲突后再提交:
$ git merge feature1
Auto-merging readme.txt
CONFLICT (content): Merge conflict in readme.txt
Automatic merge failed; fix conflicts and then commit the result.
git status也可以告诉我们冲突的文件:
$ git status
On branch master
Your branch is ahead of 'origin/master' by 2 commits.
(use "git push" to publish your local commits)
从主分支上取出文件,在文件的基础上新增自己的修改,完成后,再次提交:
$ git add readme.txt
$ git commit -m "conflict fixed"
[master cf810e4] conflict fixed
远程仓库
1.从远程仓库获取项目代码:
在本地仓库目录下打开git-bash:
git clone: 首次复制项目到本地仓库
$git clone http://10.102.55.3/zsm/zsm-backend.git
git pull:合并远程仓库的项目
$git pull
Already up to date.
2.上传项目代码到远程仓库:
$ git push -u origin master
Counting objects: 20, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (15/15), done.
Writing objects: 100% (20/20), 1.64 KiB | 560.00 KiB/s, done.
Total 20 (delta 5), reused 0 (delta 0)
remote: Resolving deltas: 100% (5/5), done.
To github.com:michaelliao/learngit.git
* [new branch] master -> master
Branch 'master' set up to track remote branch 'master' from 'origin'.
加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。
$ git push // 将本地分支推送到远程分支,需要输入git账号密码。按照提示操作即可。
使用标签
1.创建标签:
在Git中打标签非常简单,首先,切换到需要打标签的分支上:
$ git branch
* dev
master
$ git checkout master
Switched to branch 'master'
然后,敲命令git tag 就可以打一个新标签:
$ git tag v1.0
可以用命令git tag查看所有标签:
$ git tag
v1.0
给指定的commit操作打标签:
$ git tag v0.9 f52c633
//f52c633为conmmit操作对应的commit_id,可以通过git log 查询
标签管理
git push origin <tagname> //可以推送一个本地标签;
git push origin --tags //可以推送全部未推送过的本地标签;
git tag -d <tagname> //可以删除一个本地标签;
git push origin :refs/tags/<tagname> //可以删除一个远程标签。