diff --git a/blame.go b/blame.go
index adb72d5..f610851 100644
--- a/blame.go
+++ b/blame.go
@@ -193,7 +193,7 @@
 		// this first commit.
 		if i == 0 {
 			for j := 0; j < nLines; j++ {
-				b.graph[i][j] = (*object.Commit)(b.revs[i])
+				b.graph[i][j] = b.revs[i]
 			}
 		} else {
 			// if this is not the first commit, then assign to the old
@@ -211,7 +211,7 @@
 	fVs := b.graph[i]
 	result := make([]*object.Commit, 0, len(fVs))
 	for _, v := range fVs {
-		c := object.Commit(*v)
+		c := *v
 		result = append(result, &c)
 	}
 	return result
@@ -234,7 +234,7 @@
 				b.graph[c][dl] = b.graph[p][sl]
 			case hunks[h].Type == 1:
 				dl++
-				b.graph[c][dl] = (*object.Commit)(b.revs[c])
+				b.graph[c][dl] = b.revs[c]
 			case hunks[h].Type == -1:
 				sl++
 			default:
diff --git a/config/branch.go b/config/branch.go
index af61bbb..20dde6e 100644
--- a/config/branch.go
+++ b/config/branch.go
@@ -72,7 +72,7 @@
 	if b.Rebase == "" {
 		b.raw.RemoveOption(rebaseKey)
 	} else {
-		b.raw.SetOption(rebaseKey, string(b.Rebase))
+		b.raw.SetOption(rebaseKey, b.Rebase)
 	}
 
 	return b.raw
diff --git a/plumbing/format/commitgraph/encoder.go b/plumbing/format/commitgraph/encoder.go
index a06871c..615e833 100644
--- a/plumbing/format/commitgraph/encoder.go
+++ b/plumbing/format/commitgraph/encoder.go
@@ -24,8 +24,6 @@
 
 // Encode writes an index into the commit-graph file
 func (e *Encoder) Encode(idx Index) error {
-	var err error
-
 	// Get all the hashes in the input index
 	hashes := idx.Hashes()
 
@@ -39,26 +37,26 @@
 		chunkSizes = append(chunkSizes, uint64(extraEdgesCount)*4)
 	}
 
-	if err = e.encodeFileHeader(len(chunkSignatures)); err != nil {
+	if err := e.encodeFileHeader(len(chunkSignatures)); err != nil {
 		return err
 	}
-	if err = e.encodeChunkHeaders(chunkSignatures, chunkSizes); err != nil {
+	if err := e.encodeChunkHeaders(chunkSignatures, chunkSizes); err != nil {
 		return err
 	}
-	if err = e.encodeFanout(fanout); err != nil {
+	if err := e.encodeFanout(fanout); err != nil {
 		return err
 	}
-	if err = e.encodeOidLookup(hashes); err != nil {
+	if err := e.encodeOidLookup(hashes); err != nil {
 		return err
 	}
 	if extraEdges, err := e.encodeCommitData(hashes, hashToIndex, idx); err == nil {
 		if err = e.encodeExtraEdges(extraEdges); err != nil {
 			return err
 		}
-	}
-	if err != nil {
+	} else {
 		return err
 	}
+
 	return e.encodeChecksum()
 }
 
diff --git a/plumbing/format/commitgraph/file.go b/plumbing/format/commitgraph/file.go
index 175d279..1f82abd 100644
--- a/plumbing/format/commitgraph/file.go
+++ b/plumbing/format/commitgraph/file.go
@@ -249,7 +249,7 @@
 // Hashes returns all the hashes that are available in the index
 func (fi *fileIndex) Hashes() []plumbing.Hash {
 	hashes := make([]plumbing.Hash, fi.fanout[0xff])
-	for i := 0; i < int(fi.fanout[0xff]); i++ {
+	for i := 0; i < fi.fanout[0xff]; i++ {
 		offset := fi.oidLookupOffset + int64(i)*20
 		if n, err := fi.reader.ReadAt(hashes[i][:], offset); err != nil || n < 20 {
 			return nil
diff --git a/plumbing/format/commitgraph/memory.go b/plumbing/format/commitgraph/memory.go
index a4a96e9..f5afd4c 100644
--- a/plumbing/format/commitgraph/memory.go
+++ b/plumbing/format/commitgraph/memory.go
@@ -31,7 +31,7 @@
 // GetCommitDataByIndex gets the commit node from the commit graph using index
 // obtained from child node, if available
 func (mi *MemoryIndex) GetCommitDataByIndex(i int) (*CommitData, error) {
-	if int(i) >= len(mi.commitData) {
+	if i >= len(mi.commitData) {
 		return nil, plumbing.ErrObjectNotFound
 	}
 
diff --git a/plumbing/format/diff/unified_encoder.go b/plumbing/format/diff/unified_encoder.go
index 8bd6d8a..169242d 100644
--- a/plumbing/format/diff/unified_encoder.go
+++ b/plumbing/format/diff/unified_encoder.go
@@ -94,7 +94,7 @@
 	isEmpty := message == ""
 	hasSuffix := strings.HasSuffix(message, "\n")
 	if !isEmpty && !hasSuffix {
-		message = message + "\n"
+		message += "\n"
 	}
 
 	e.buf.WriteString(message)
diff --git a/plumbing/format/gitattributes/pattern.go b/plumbing/format/gitattributes/pattern.go
index c5ca0c7..d961aba 100644
--- a/plumbing/format/gitattributes/pattern.go
+++ b/plumbing/format/gitattributes/pattern.go
@@ -66,7 +66,7 @@
 			doublestar = true
 		}
 
-		switch true {
+		switch {
 		case strings.Contains(pattern[0], "**"):
 			return false
 
diff --git a/plumbing/format/idxfile/decoder.go b/plumbing/format/idxfile/decoder.go
index 5b92782..9e9c176 100644
--- a/plumbing/format/idxfile/decoder.go
+++ b/plumbing/format/idxfile/decoder.go
@@ -110,10 +110,6 @@
 			continue
 		}
 
-		if buckets < 0 {
-			return ErrMalformedIdxFile
-		}
-
 		idx.FanoutMapping[k] = len(idx.Names)
 
 		nameLen := int(buckets * objectIDLength)
diff --git a/plumbing/format/idxfile/writer.go b/plumbing/format/idxfile/writer.go
index aa919e7..fcc78c5 100644
--- a/plumbing/format/idxfile/writer.go
+++ b/plumbing/format/idxfile/writer.go
@@ -147,7 +147,7 @@
 		idx.Offset32[bucket] = append(idx.Offset32[bucket], buf.Bytes()...)
 
 		buf.Truncate(0)
-		binary.WriteUint32(buf, uint32(o.CRC32))
+		binary.WriteUint32(buf, o.CRC32)
 		idx.CRC32[bucket] = append(idx.CRC32[bucket], buf.Bytes()...)
 	}
 
diff --git a/plumbing/format/packfile/scanner_test.go b/plumbing/format/packfile/scanner_test.go
index a401d6d..3078477 100644
--- a/plumbing/format/packfile/scanner_test.go
+++ b/plumbing/format/packfile/scanner_test.go
@@ -140,6 +140,7 @@
 	p := NewScanner(r)
 
 	version, objects, err := p.Header()
+	c.Assert(err, IsNil)
 	c.Assert(version, Equals, VersionSupported)
 	c.Assert(objects, Equals, uint32(31))
 
diff --git a/plumbing/object/commit_walker_bfs_filtered_test.go b/plumbing/object/commit_walker_bfs_filtered_test.go
index d31bdf0..6984b60 100644
--- a/plumbing/object/commit_walker_bfs_filtered_test.go
+++ b/plumbing/object/commit_walker_bfs_filtered_test.go
@@ -29,9 +29,7 @@
 func assertHashes(c *C, commits []*Commit, hashes []string) {
 	if len(commits) != len(hashes) {
 		var expected []string
-		for _, c := range hashes {
-			expected = append(expected, c)
-		}
+		expected = append(expected, hashes...)
 		fmt.Println("expected:", strings.Join(expected, ", "))
 		var got []string
 		for _, c := range commits {
@@ -48,11 +46,7 @@
 
 func validIfCommit(ignored plumbing.Hash) CommitFilter {
 	return func(c *Commit) bool {
-		if c.Hash == ignored {
-			return true
-		}
-
-		return false
+		return c.Hash == ignored
 	}
 }
 
diff --git a/plumbing/object/merge_base.go b/plumbing/object/merge_base.go
index 689e421..6f2568d 100644
--- a/plumbing/object/merge_base.go
+++ b/plumbing/object/merge_base.go
@@ -32,7 +32,7 @@
 	var res []*Commit
 	inNewerHistory := isInIndexCommitFilter(newerHistory)
 	resIter := NewFilterCommitIter(older, &inNewerHistory, &inNewerHistory)
-	err = resIter.ForEach(func(commit *Commit) error {
+	_ = resIter.ForEach(func(commit *Commit) error {
 		res = append(res, commit)
 		return nil
 	})
diff --git a/plumbing/object/patch.go b/plumbing/object/patch.go
index 1efd0b1..32454ac 100644
--- a/plumbing/object/patch.go
+++ b/plumbing/object/patch.go
@@ -278,7 +278,7 @@
 	var scaleFactor float64
 	if longestTotalChange > heightOfHistogram {
 		// Scale down to heightOfHistogram.
-		scaleFactor = float64(longestTotalChange / heightOfHistogram)
+		scaleFactor = longestTotalChange / heightOfHistogram
 	} else {
 		scaleFactor = 1.0
 	}
diff --git a/plumbing/object/patch_test.go b/plumbing/object/patch_test.go
index 47057fb..37944c3 100644
--- a/plumbing/object/patch_test.go
+++ b/plumbing/object/patch_test.go
@@ -19,6 +19,7 @@
 		fixtures.ByURL("https://github.com/git-fixtures/submodule.git").One().DotGit(), cache.NewObjectLRUDefault())
 
 	commit, err := GetCommit(storer, plumbing.NewHash("b685400c1f9316f350965a5993d350bc746b0bf4"))
+	c.Assert(err, IsNil)
 
 	tree, err := commit.Tree()
 	c.Assert(err, IsNil)
diff --git a/plumbing/object/tree.go b/plumbing/object/tree.go
index d30cf6e..d0b4fff 100644
--- a/plumbing/object/tree.go
+++ b/plumbing/object/tree.go
@@ -288,7 +288,7 @@
 			return err
 		}
 
-		if _, err = w.Write([]byte(entry.Hash[:])); err != nil {
+		if _, err = w.Write(entry.Hash[:]); err != nil {
 			return err
 		}
 	}
@@ -517,4 +517,4 @@
 		return parent + "/" + child
 	}
 	return child
-}
\ No newline at end of file
+}
diff --git a/plumbing/protocol/packp/advrefs.go b/plumbing/protocol/packp/advrefs.go
index 684e76a..487ee19 100644
--- a/plumbing/protocol/packp/advrefs.go
+++ b/plumbing/protocol/packp/advrefs.go
@@ -107,7 +107,7 @@
 		return nil
 	}
 
-	ref, err := s.Reference(plumbing.ReferenceName(plumbing.Master))
+	ref, err := s.Reference(plumbing.Master)
 
 	// check first if HEAD is pointing to master
 	if err == nil {
diff --git a/plumbing/protocol/packp/updreq_decode.go b/plumbing/protocol/packp/updreq_decode.go
index c15d49c..51e8183 100644
--- a/plumbing/protocol/packp/updreq_decode.go
+++ b/plumbing/protocol/packp/updreq_decode.go
@@ -225,7 +225,7 @@
 		return nil, errInvalidNewObjId(err)
 	}
 
-	return &Command{Old: oh, New: nh, Name: plumbing.ReferenceName(n)}, nil
+	return &Command{Old: oh, New: nh, Name: n}, nil
 }
 
 func parseHash(s string) (plumbing.Hash, error) {
diff --git a/plumbing/transport/server/server.go b/plumbing/transport/server/server.go
index 20bd12e..8e0dcc1 100644
--- a/plumbing/transport/server/server.go
+++ b/plumbing/transport/server/server.go
@@ -286,11 +286,6 @@
 				continue
 			}
 
-			if err != nil {
-				s.setStatus(cmd.Name, err)
-				continue
-			}
-
 			ref := plumbing.NewHashReference(cmd.Name, cmd.New)
 			err := s.storer.SetReference(ref)
 			s.setStatus(cmd.Name, err)
diff --git a/plumbing/transport/ssh/auth_method.go b/plumbing/transport/ssh/auth_method.go
index dbb47c5..1e5c383 100644
--- a/plumbing/transport/ssh/auth_method.go
+++ b/plumbing/transport/ssh/auth_method.go
@@ -61,7 +61,7 @@
 	return a.SetHostKeyCallback(&ssh.ClientConfig{
 		User: a.User,
 		Auth: []ssh.AuthMethod{
-			ssh.KeyboardInteractiveChallenge(a.Challenge),
+			a.Challenge,
 		},
 	})
 }
diff --git a/prune_test.go b/prune_test.go
index 670cd07..2279636 100644
--- a/prune_test.go
+++ b/prune_test.go
@@ -56,6 +56,8 @@
 		newCount++
 		return nil
 	})
+	c.Assert(err, IsNil)
+
 	if deleteTime.IsZero() {
 		c.Assert(newCount < count, Equals, true)
 	} else {
diff --git a/remote.go b/remote.go
index e229ef1..baee7a0 100644
--- a/remote.go
+++ b/remote.go
@@ -937,7 +937,7 @@
 		updated = true
 	}
 
-	if err == nil && forceNeeded {
+	if forceNeeded {
 		err = ErrForceNeeded
 	}
 
diff --git a/repository_test.go b/repository_test.go
index 32fa4fa..b87eabb 100644
--- a/repository_test.go
+++ b/repository_test.go
@@ -336,12 +336,14 @@
 		Merge:  "refs/heads/foo",
 	}
 	err = r.CreateBranch(testBranch1)
-	err = r.CreateBranch(testBranch2)
-
 	c.Assert(err, IsNil)
+	err = r.CreateBranch(testBranch2)
+	c.Assert(err, IsNil)
+
 	cfg, err := r.Config()
 	c.Assert(err, IsNil)
 	marshaled, err := cfg.Marshal()
+	c.Assert(err, IsNil)
 	c.Assert(string(expected), Equals, string(marshaled))
 }
 
diff --git a/storage/filesystem/dotgit/dotgit_test.go b/storage/filesystem/dotgit/dotgit_test.go
index 73b0291..31c6fe0 100644
--- a/storage/filesystem/dotgit/dotgit_test.go
+++ b/storage/filesystem/dotgit/dotgit_test.go
@@ -226,6 +226,7 @@
 		"refs/remotes/origin/branch",
 		"e8d3ffab552895c19b9fcf7aa264d277cde33881",
 	), nil)
+	c.Assert(err, IsNil)
 
 	// Make sure it only appears once in the refs list.
 	refs, err := dir.Refs()
diff --git a/utils/merkletrie/difftree_test.go b/utils/merkletrie/difftree_test.go
index ac86145..f725bcf 100644
--- a/utils/merkletrie/difftree_test.go
+++ b/utils/merkletrie/difftree_test.go
@@ -177,7 +177,7 @@
 
 	for _, chunk := range strings.Split(s, " ") {
 		change := change{
-			path: string(chunk[1:]),
+			path: chunk[1:],
 		}
 
 		switch chunk[0] {
diff --git a/utils/merkletrie/noder/path_test.go b/utils/merkletrie/noder/path_test.go
index f49f028..f65b1d5 100644
--- a/utils/merkletrie/noder/path_test.go
+++ b/utils/merkletrie/noder/path_test.go
@@ -154,8 +154,8 @@
 }
 
 func (s *PathSuite) TestCompareNormalization(c *C) {
-	p1 := Path([]Noder{&noderMock{name: norm.Form(norm.NFKC).String("페")}})
-	p2 := Path([]Noder{&noderMock{name: norm.Form(norm.NFKD).String("페")}})
+	p1 := Path([]Noder{&noderMock{name: norm.NFKC.String("페")}})
+	p2 := Path([]Noder{&noderMock{name: norm.NFKD.String("페")}})
 	c.Assert(p1.Compare(p2), Equals, 1)
 	c.Assert(p2.Compare(p1), Equals, -1)
 	p1 = Path([]Noder{&noderMock{name: "TestAppWithUnicodéPath"}})
diff --git a/worktree_commit_test.go b/worktree_commit_test.go
index da377c6..5bcbac9 100644
--- a/worktree_commit_test.go
+++ b/worktree_commit_test.go
@@ -210,7 +210,7 @@
 	r, err := Init(st, nil)
 	c.Assert(err, IsNil)
 
-	r, err = Clone(memory.NewStorage(), memfs.New(), &CloneOptions{
+	r, _ = Clone(memory.NewStorage(), memfs.New(), &CloneOptions{
 		URL: path,
 	})
 
diff --git a/worktree_linux.go b/worktree_linux.go
index 891cb1c..efb01b5 100644
--- a/worktree_linux.go
+++ b/worktree_linux.go
@@ -12,7 +12,7 @@
 func init() {
 	fillSystemInfo = func(e *index.Entry, sys interface{}) {
 		if os, ok := sys.(*syscall.Stat_t); ok {
-			e.CreatedAt = time.Unix(int64(os.Ctim.Sec), int64(os.Ctim.Nsec))
+			e.CreatedAt = time.Unix(os.Ctim.Sec, os.Ctim.Nsec)
 			e.Dev = uint32(os.Dev)
 			e.Inode = uint32(os.Ino)
 			e.GID = os.Gid
diff --git a/worktree_test.go b/worktree_test.go
index 045a76d..dab1c23 100644
--- a/worktree_test.go
+++ b/worktree_test.go
@@ -432,7 +432,7 @@
 	err = w.Filesystem.Remove(filename)
 	c.Assert(err, IsNil)
 
-	modFilename := norm.Form(norm.NFKD).String(filename)
+	modFilename := norm.NFKD.String(filename)
 	writeFile(modFilename)
 
 	_, err = w.Add(filename)
@@ -1675,6 +1675,7 @@
 
 	// Status before cleaning.
 	status, err := wt.Status()
+	c.Assert(err, IsNil)
 	c.Assert(len(status), Equals, 2)
 
 	err = wt.Clean(&CleanOptions{})
