您的位置:首页 > 其它

Git学习笔记(一)--本地操作

2017-07-18 17:37 447 查看
整理自https://www.atlassian.com/git/tutorials/setting-up-a-repository

一、设置仓库

设置

Git的设置有三种生效范围:当前仓库、当前系统用户、当前系统。优先级递减。

如果添加了
--global
标志,则设置生效范围是当前用户。如果没有添加,或者添加
--local
标志,生效范围是当前仓库。

设置用户

git config --global user.name xxxx


git config --global user.email xxxx@xxxx.xxx


设置快捷命令

git config --global alias.ci commit


设置后
git ci
就相当于
git commit


创建仓库

仓库的创建可以通过新建和复制已有的远程仓库两种方式实现。

新建仓库

直接在指定目录下创建仓库,创建完毕会自动生成一个.git隐藏文件夹

git init


复制仓库

git clone <repo url>


repo url可以使用多种格式,比如Git SSH格式为

git@HOSTNAME:USERNAME/REPONAME.git


HTTPS格式为:

https://github.com/timshinlee/TagViewGroup.git


git init
不同的是clone下来的仓库是与远程仓库绑定的了,可以直接push。

给本地仓库指定远程仓库

git remote add <remote_name> <remote_repo_url>


查看仓库

git status

git status
可以查看当前目录的文件状态

文件有四种状态

untracked(没有进行过add操作)

Untracked files:
(use "git add <file>..." to include in what will be committed)

TestStash.txt


staged(新建文件或者编辑文件之后已经add了,所以刚add过的都是staged)

Changes to be committed:
(use "git rm --cached <file>..." to unstage)

new file:   GitCommit.txt


not staged(已经add过变staged,但是又修改过变unstaged,文件类型为modified)

Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(
4000
use "git checkout -- <file>..." to discard changes in working directory)

modified:   GitCommit.txt


commited

git log

二、保存修改

添加修改的文件到缓存区和从缓存区删除某个文件

git add <file>


缓存区的文件在调用
commit
操作后会提交到工程历史当中。add操作用来指定哪些文件是要提交的。add后可以指定某个文件名,或者使用英文句号.代表添加所有文件。这个添加操作是添加修改后的文件到缓存区里,新建文件或者编辑文件后,该文件都会变成未添加状态。

如果要从缓存区中删除某个文件的话,可以使用移除命令

git rm --cached xxxx


提交

添加完毕之后还需要提交才能真正保存修改。

git commit -m "xxxxx"


引号内为提交的说明

推送到远程仓库

git push -u <remote_name> <local_branch_name>


git stash临时保存修改

可以把当前已修改但是又还没准备commit的内容保存保存起来,切换到其他地方,然后再切换回来。不管是staged或者unstaged的修改都会先回退到上一次commit的状态。

// stash之前
$ 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:   GitCommit.txt

// 进行stash
$ git stash
Saved working directory and index state WIP on master: 82562d1 second commit
HEAD is now at 82562d1 second commit

// stash之后
$ git status
On branch master
nothing to commit, working tree clean


stash操作是本地的,push到远程仓库的时候不会把stash内容页推送过去。

stash操作默认不会保存untracked和设置为ignored的文件。可以通过添加
-u
或者
--include -untracked
标志来保存untracked文件。也可以通过添加
-a
或者
--all
来保存包括ignored的文件。

恢复stash内容

第一种操作可以使用pop命令

// 恢复之前
$ git status
On branch master
nothing to commit, working tree clean

// 恢复操作
$ git stash pop
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:   GitCommit.txt

no changes added to commit (use "git add" and/or "git commit -a")
Dropped refs/stash@{0} (94c2f4e70957e2eef9ea21ef924229ab5b45b356)


pop操作就是把之前修改的内容应用到当前的工程,然后再移除掉。

第二种操作为apply,把之前修改的内容应用到当前工程,同时还保留不移除掉。这样子同一份修改可以同时应用在多个分支。

三、撤销改变

git checkout

checkout对象可以是文件、commit或者分支。讲到checkout要引入一个HEADER概念,HEADER正常状态下指向master分支或者某个子分支。

1. checkout文件

git checkout <commit> <file>


单独检出一个文件到当前工作目录,与checkout commit不同,会影响当前状态,此时可以把检出的文件提交到下一次commit,所以检出单个文件相当于把这个文件回退到某个commit的状态。

2. checkout commit

git checkout <commit>


更新当前工作目录到完全匹配指定的commit。检出commit是进入到那个commit,并不会影响已有分支。参数可以使用commit的哈希值或者使用tag名称。

checkout commit会使正常指向分支的HEADER指向某个commit,就会进入一个”detached HEADER”的状态。

3. checkout分支

git checkout master


git revert

git revert <commit>


git revert并不会影响操作历史,而是把某个commit的操作逆向操作一遍,使文件恢复原状,然后再commit一次。

比如说某个bug是由于某个commit产生的,此时可以revert那个commit解决bug。

revert操作可以指定某个任意的commit。

git reset

reset才是真的撤销某个commit。与revert不同,reset只能从当前的commit往回撤销。如果要撤销指定某个中间点的commit,只能撤销这中间的所有commit,然后再把那些不需撤销的重新commit一次。

reset操作要谨慎使用,因为这会导致reset掉的commit无法恢复。reset操作应该只对本地文件使用,禁止对与其他开发者分享的文件进行reset操作。

git reset <file>


从缓存区移除掉指定的文件,对于当前工作目录没有任何影响。

git reset


重置缓存区以匹配最近的commit,对于当前工作目录没有任何影响。

git reset --hard


重置缓存区和工作目录以匹配最近的commit,
--hard
标志表示覆盖所有修改的地方,所有未提交的修改都会被删除掉。

git reset <commit>


把当前分支回退到某个commit的状态,重置缓存区至指定commit状态,但是工作目录是不变的,所以可以一次性重新提交。

git reset --hard <commit>


把当前分支回退到某个commit的状态,重置缓存区和当前工作目录至指定commit状态,指定commit之后的commit都会被删掉。

revert和reset

revert可以用来安全地撤销一个公共的commit,reset是用来撤销本地的修改。如果commit被push到远程仓库了,就最好不要用reset来撤销。

git clean

用来删除本地那些untracked文件

git clean -n
列出预删除列表

四、重写历史

git commit --amend

git commit --amend
可以用来对最近一次的commit进行修改,提交一些当前的修改进去而不用进行一次新的提交。如果当前没有修改的话就可以用来修改修改commit的信息。

不过实际上,amend命令是用修改过的commit完全替换旧的commit的,对于git来说相当于全新的commit。

但是有个关键点要记住,不要修改已经push的commit。amended commit实际上是一个新的commit,旧的commit会从工程历史中移除掉。如果修改已经push的commit,后果跟reset这个commit是一样的,如果其他开发者基于这个commit进行修改,会导致复杂的情况。

git rebase

rebase是一个把当前分支移动到其他commit上,如下图所示:



从内容的角度上来讲,rebase只是把分支移动到其他commit上,但是实际上是通过创建一个新的commit,然后把这个commit应用到指定的基础上,所以是重写了工程历史。

git rebase <base>


把当前分支重定基址,可以重定到任意形式的commit引用,比如一个哈希id,分支名称,tag名称或者对于HEAD的相对引用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: