当前位置:   article > 正文

Git学习笔记(一)--本地操作_`--repo-url`使用本地仓库

`--repo-url`使用本地仓库

整理自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
  • 1
  • 2
  • 3
  • 4
  • 5
  • staged(新建文件或者编辑文件之后已经add了,所以刚add过的都是staged)
Changes to be committed:
  (use "git rm --cached <file>..." to unstage)

        new file:   GitCommit.txt
  • 1
  • 2
  • 3
  • 4
  • not staged(已经add过变staged,但是又修改过变unstaged,文件类型为modified)
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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

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的相对引用。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/636629
推荐阅读
相关标签
  

闽ICP备14008679号