Git学习笔记(一)--本地操作
2017-07-18 17:37
447 查看
整理自https://www.atlassian.com/git/tutorials/setting-up-a-repository
如果添加了
设置用户
设置快捷命令
设置后
新建仓库
直接在指定目录下创建仓库,创建完毕会自动生成一个.git隐藏文件夹
复制仓库
repo url可以使用多种格式,比如Git SSH格式为
HTTPS格式为:
与
文件有四种状态
untracked(没有进行过add操作)
staged(新建文件或者编辑文件之后已经add了,所以刚add过的都是staged)
not staged(已经add过变staged,但是又修改过变unstaged,文件类型为modified)
commited
缓存区的文件在调用
如果要从缓存区中删除某个文件的话,可以使用移除命令
引号内为提交的说明
stash操作是本地的,push到远程仓库的时候不会把stash内容页推送过去。
stash操作默认不会保存untracked和设置为ignored的文件。可以通过添加
pop操作就是把之前修改的内容应用到当前的工程,然后再移除掉。
第二种操作为apply,把之前修改的内容应用到当前工程,同时还保留不移除掉。这样子同一份修改可以同时应用在多个分支。
1. checkout文件
单独检出一个文件到当前工作目录,与checkout commit不同,会影响当前状态,此时可以把检出的文件提交到下一次commit,所以检出单个文件相当于把这个文件回退到某个commit的状态。
2. checkout commit
更新当前工作目录到完全匹配指定的commit。检出commit是进入到那个commit,并不会影响已有分支。参数可以使用commit的哈希值或者使用tag名称。
checkout commit会使正常指向分支的HEADER指向某个commit,就会进入一个”detached HEADER”的状态。
3. checkout分支
git revert并不会影响操作历史,而是把某个commit的操作逆向操作一遍,使文件恢复原状,然后再commit一次。
比如说某个bug是由于某个commit产生的,此时可以revert那个commit解决bug。
revert操作可以指定某个任意的commit。
reset操作要谨慎使用,因为这会导致reset掉的commit无法恢复。reset操作应该只对本地文件使用,禁止对与其他开发者分享的文件进行reset操作。
从缓存区移除掉指定的文件,对于当前工作目录没有任何影响。
重置缓存区以匹配最近的commit,对于当前工作目录没有任何影响。
重置缓存区和工作目录以匹配最近的commit,
把当前分支回退到某个commit的状态,重置缓存区至指定commit状态,但是工作目录是不变的,所以可以一次性重新提交。
把当前分支回退到某个commit的状态,重置缓存区和当前工作目录至指定commit状态,指定commit之后的commit都会被删掉。
不过实际上,amend命令是用修改过的commit完全替换旧的commit的,对于git来说相当于全新的commit。
但是有个关键点要记住,不要修改已经push的commit。amended commit实际上是一个新的commit,旧的commit会从工程历史中移除掉。如果修改已经push的commit,后果跟reset这个commit是一样的,如果其他开发者基于这个commit进行修改,会导致复杂的情况。
rebase是一个把当前分支移动到其他commit上,如下图所示:
从内容的角度上来讲,rebase只是把分支移动到其他commit上,但是实际上是通过创建一个新的commit,然后把这个commit应用到指定的基础上,所以是重写了工程历史。
把当前分支重定基址,可以重定到任意形式的commit引用,比如一个哈希id,分支名称,tag名称或者对于HEAD的相对引用。
一、设置仓库
设置
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的相对引用。
相关文章推荐
- 【Git学习笔记】Github与本地仓库的交互操作
- Git学习笔记(4)----基本操作及命令(本地仓库篇)
- Git学习总结(一):本地操作
- Git-Windos 安装操作学习笔记
- 【Git学习笔记】用git pull取回远程仓库某个分支的更新,再与本地的指定分支自动merge
- Git学习系列(二)创建本地仓库及文件操作
- git学习和使用(一) 本地版本库的操作
- Git学习系列(二)创建本地仓库及文件操作
- Git 学习笔记<本地版本库的管理> (二)
- Git与GitHub学习笔记(三).gitignore文件忽略和删除本地以及远程文件
- GitHub学习笔记:本地操作
- git学习笔记——本地
- Git学习笔记(四)——分支管理和远程操作
- (ubuntu 16.04) Git 本地仓库简单操作学习 (二)
- (ubuntu 16.04) Git 本地仓库简单操作学习 (一)
- 学习github(2) -- git 本地库命令操作
- git学习笔记整理-2一次完整的操作
- Git学习-本地版本库的创建与简单操作
- git学习笔记(本地仓库与github)